Angularjs FB使用工厂

时间:2016-01-28 10:57:31

标签: javascript angularjs facebook

我是angularjs.的新手。我正在使用工厂,我写了fb登录代码。 在最后一步中,我将所有数据发送到我的服务器,用户在我的数据库中注册并发送令牌。

这是代码。

'use strict'

APP.factory('authenticationFactory',['ENV','$http','$rootScope', function (ENV,$http,$rootScope) {

    return {

          socialLogin:function(data){
            return $http.post($rootScope.apiURL+'sociallogin',data).then(function (resp) {
               if(resp.status == 200) {
                   return resp.data;
               }
            })
        },
        fbLogin: function () {
            var FB = window.FB;
            var scopes = 'public_profile,email';

            var that = this;

            FB.login(function (response) {
                return that.facebookStatusChangeCallback(response);
            }, {scope: scopes});
        },

        facebookStatusChangeCallback: function(response){
            if (response.status === 'connected') {
                // Logged into your app and Facebook.
                var r = this.facebookApiRequest(response);
                console.log(r);
            } else if (response.status === 'not_authorized') {
                // The person is logged into Facebook, but not your app.
                console.log('Please log into this app.');

            } else {
                // The person is not logged into Facebook, so we're not sure if
                // they are logged into this app or not.
                console.log('Please log into Facebook.');
            }
        },

        facebookApiRequest: function (authResponse) {
            var that = this;
            var r = FB.api('/me?fields=id,name,email,gender,first_name,last_name,age_range,link,birthday', function (response) {
                var r = FB.api("/" + response.id + "/picture?height=720", function (pictureResponse) {
                    if (pictureResponse && !pictureResponse.error) {
                        /* handle the result */
                        response.profile_pic = pictureResponse.data.url;
                        response.access_token = authResponse.authResponse.accessToken;
                        response.provider = 'facebook';
                        response.devicetoken = '';
                        response.full_name = response.first_name+' '+response.last_name;
                        var r = that.socialPluginLogin(response).then(function (resp) {
                            return that.resp;
                        });
                        return r;
                    } else {
                        console.log('error while fatching fb pic');
                    }
                });
                console.log(r);
            });
            console.log(that);
        },

        socialPluginLogin : function (data) {
            var resp = this.socialLogin(data).then(function (resp) {
                return resp;
            });
            return resp;

        }

    };
}]);

我从我的控制器调用fbLogin()函数。我需要函数socialLogin()的响应,以便我可以改变状态。

我哪里出错。??

2 个答案:

答案 0 :(得分:1)

答案指向错误的方向,另一次尝试:

您的函数fbLogin应该返回一个承诺,可以在socialLogin之后解决。由于fbLogin没有返回任何内容,因此您不会从完成的登录中收到任何信号。

见:

// We add $q here
APP.factory('authenticationFactory',['ENV','$http','$rootScope','$q', function (ENV,$http,$rootScope,$q) {

    var loginPromise;

    return {
        socialLogin:function(data){
            return $http.post($rootScope.apiURL+'sociallogin',data).then(function (resp) {
                if(resp.status == 200) {

                    // This is your connection to the controller
                    loginPromise.resolve(resp.data);

                    return resp.data;
                }
            })
        },
        fbLogin: function () {
            var FB = window.FB;
            var scopes = 'public_profile,email';

            var that = this;

            FB.login(function (response) {
                return that.facebookStatusChangeCallback(response);
            }, {scope: scopes});

            // Create and return a promise
            loginPromise = $q.defer();

            // EDIT: My fault, return the promise:
            return loginPromise.promise;
        },
        //...

并将其添加到控制器:

authenticationFactory.fbLogin().then(function(data){
    // Check it out:
    console.dir(data);
})

您应该考虑的其他事项:

  • 在函数体中定义函数,而不是在return语句中定义函数。您可以通过这种方式消除that=this
  • 仅返回API,而不是所有函数
  • 阅读承诺,他们是进入角度世界的方式。你也可以使用回调,但这些都很难处理。

答案 1 :(得分:0)

将您的socialLogin功能更改为以下功能,您的函数将返回一个承诺对象,您可以通过socialPluginLogin通过then使用该承诺对象。

socialLogin:function(data){
    return $http.post($rootScope.apiURL+'sociallogin',data)
},