不推迟延期的承诺 [英] Deferred promise not deferring

查看:140
本文介绍了不推迟延期的承诺的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

喜在以下角控制器我尝试启动Facebook登录与Parse.com。
因此,我创建触发fbLogIn的承诺。什么是应该做的,是第一次登录到Facebook和抢FIRST_NAME并将其存储在fieldValues​​Service.ff。
然后,它应该访问此值,并用它做什么。为了说明目的,我只是用控制台日志。
什么情况是,在第二次则第二的console.log从第一。然后第一个因此是不确定之前触发。
我不明白为什么在第二。那么什么才能够在这种情况下第一个被触发。

另外第二个问题,注销之后,fbLogIn功能是未激活的某个时候。它不会再次触发登录过程

如果你对这个问题的线索你的帮助会大大AP preciated。

  .controller('logController',
    功能($范围,$ Q,fieldValues​​Service){
        变种延迟= $ q.defer();         defer.promise
         。然后(函数(){
                 Parse.FacebookUtils.logIn(NULL,{
                     成功:功能(用户){
                         如果(!user.existed()){
                             警报(用户注册并通过Facebook登录!);
                         }其他{
                             $ scope.currentUser =用户;
                             $ $范围适用于()。
                             FB.api('/我',函数(响应){
                                 fieldValues​​Service.ff = response.first_name;
                                 的console.log(fieldValues​​Service.ff); //日志鲍勃                             });
                         }
                     },
                     错误:功能(用户,错误){
                         警报(用户取消了Facebook登录或没有充分授权。);
                     }
                 });
             })
         。然后(函数(){
                 的console.log(fieldValues​​Service.ff); //日志未定义
         });
        $ scope.fbLogIn =功能(){
               defer.resolve();           };         //解析注销
        $ scope.logOut =功能(形式){
            Parse.User.logOut();
            $ scope.currentUser = NULL;        };
    });


解决方案

也许如果你调整你的code,事情会变得稍微容易一些。

我建议重构一切有关FB到它自己的服务,如:

  module.factory('FBService',函数($ Q){
    VAR登录,
    登出,
    获取信息;
    登录名=函数(){
        变种延迟执行= $ q.defer();
        Parse.FacebookUtils.logIn(NULL,{
            成功:功能(用户){
                defered.resolve(用户);
            },
            错误:功能(用户,错误){
                defered.reject(用户,错误);
            }
        });
        返回defered.promise;
    };
    注销=功能(){
        变种延迟执行= $ q.defer();
        Parse.User.logOut();
        defered.resolve();
        返回defered.promise;
    };
    getInformation =功能(){
        变种延迟执行= $ q.defer();
        FB.api('/我',函数(响应){
            defered.resolve(响应);
        });
        返回defered.promise;
    }
    返回{
        登录:登录,
        注销:注销,
        getInformation:getInformation
    };
});module.controller(LoginCtrl功能($范围,FBService,fieldValues​​Service){
    $ scope.fbLogIn =功能(){
        FBService.login()。然后(功能(用户){
            $ scope.currentUser =用户;
            返回FBService.getInformation();
        }),然后(功能(信息){
            fieldValues​​Service.ff = information.first_name;
            的console.log(fieldValues​​Service.ff);
        });
    };
    $ scope.logOut =功能(){
        FBService.logout()。然后(函数(){
            $ scope.currentUser = NULL;
         });
    };
});

Hi in the following Angular controller i try to initiate facebook login with Parse.com. So I created a promise triggered on fbLogIn. What it is supposed to do, is first login to facebook, and grab first_name and store it in fieldValuesService.ff. THEN, it is supposed to access this value and do something with it. For illustration purpose I just used console logs. What happens is that the second console.log in second then is triggered before the first one from first .then thus is undefined. I don't understand why anything in the second .then can be triggered before first one in this situation.

Also second problem, after a logout, the fbLogIn function is sometime inactive: it won't trigger the login process again.

If you have a clue on this issue your help will be greatly appreciated.

.controller('logController',
    function ($scope, $q, fieldValuesService) {
        var defer = $q.defer();

         defer.promise
         .then(function() {
                 Parse.FacebookUtils.logIn(null, {
                     success: function(user) {
                         if (!user.existed()) {
                             alert("User signed up and logged in through Facebook!");
                         } else {
                             $scope.currentUser = user;
                             $scope.$apply();
                             FB.api('/me', function(response) {
                                 fieldValuesService.ff = response.first_name;
                                 console.log(fieldValuesService.ff); //logs bob

                             });
                         }
                     },
                     error: function(user, error) {
                         alert("User cancelled the Facebook login or did not fully authorize.");
                     }
                 });
             })
         .then(function(){
                 console.log(fieldValuesService.ff); //logs undefined
         });


        $scope.fbLogIn = function() {
               defer.resolve();

           };

         // Parse log out
        $scope.logOut = function(form) {
            Parse.User.logOut();
            $scope.currentUser = null;

        };
    });   

解决方案

Maybe if you restructure your code, things will become a little bit easier.

I recommend to refactor everything FB related into its own service like:

module.factory('FBService', function ($q) {
    var login,
    logout,
    getInformation;
    login = function () {
        var defered = $q.defer();
        Parse.FacebookUtils.logIn(null, {
            success: function (user) {
                defered.resolve(user);
            },
            error: function (user, error) {
                defered.reject(user, error);
            }
        });
        return defered.promise;
    };
    logout = function () {
        var defered = $q.defer();
        Parse.User.logOut();
        defered.resolve();
        return defered.promise;
    };
    getInformation = function () {
        var defered = $q.defer();
        FB.api('/me', function (response) {
            defered.resolve(response);
        });
        return defered.promise;
    }
    return {
        login: login,
        logout: logout,
        getInformation: getInformation
    };
});

module.controller("LoginCtrl", function ($scope, FBService, fieldValuesService) {
    $scope.fbLogIn = function () {
        FBService.login().then(function (user) {
            $scope.currentUser = user;
            return FBService.getInformation();
        }).then(function (information) {
            fieldValuesService.ff = information.first_name;
            console.log(fieldValuesService.ff);
        });
    };
    $scope.logOut = function () {
        FBService.logout().then(function () {
            $scope.currentUser = null;
         });
    };
});

这篇关于不推迟延期的承诺的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆