Javascript AngularJS-对Facebook API的异步调用

Javascript AngularJS-对Facebook API的异步调用,javascript,angularjs,Javascript,Angularjs,我正在尝试用AngularJS调用Facebook API 问题是来自FBAPI的所有调用都是异步的,所以我需要知道我在facebook上的查询何时可以在agularjs中使用 为此,我在控制器中调用此方法: .controller('MainCtrl', function ($scope, facebook) { Facebook.getLoginStatus() 哪个Facebook是我的服务,定义为: app.factory('Facebook',function(){ } 在这种情况下

我正在尝试用AngularJS调用Facebook API

问题是来自FBAPI的所有调用都是异步的,所以我需要知道我在facebook上的查询何时可以在agularjs中使用

为此,我在控制器中调用此方法:

.controller('MainCtrl', function ($scope, facebook) {
Facebook.getLoginStatus()

哪个Facebook是我的服务,定义为:

app.factory('Facebook',function(){

}

在这种情况下,我想检查用户是否已登录。如果为true,我将显示一些选项,否则,我将显示登录按钮

我已经尝试使用$q.defer()函数、承诺、工厂来查看响应数据,一切都可以。但任何东西都可以按照我的意愿工作。我根据示例检查了一些开发示例,但我认为我不完全理解angularjs中的异步调用


提前感谢。

这里有一个完整的基本工作示例,可以将Facebook API包装到角度服务中:

另请参见我对这个问题的回答(其中有一些角度积分的部分示例):


我编写了这个模块angularjs facebook作为一个提供者,这样在配置中你可以配置你的应用id,然后你可以使用facebook异步调用。还有一些方法可以监听控制器


这是一个使用iTunesAPI进行异步http请求的好例子。它应该可以帮助您了解如何使用Facebook API进行异步http请求


如果你想让所有的FB代码稍微有点角度的风格,考虑做一些事情,比如在一个提供者中封装FB类。FB是一个很难得的例子,其中提供者模式实际上是很好用的(在配置部分上设置你的APP ID)。 下面是一个facebook提供商的示例,它具有基本的登录功能和进行graph api调用的通用方法:

app.provider('facebook', function() {
  var fbReady = false
  this.appID = 'Default';

  function fbInit(appID) {
    (function(d, s, id) {
      var js, fjs = d.getElementsByTagName(s)[0];
      if (d.getElementById(id)) return;
      js = d.createElement(s); js.id = id;
      js.src = "//connect.facebook.net/en_US/sdk.js";
      fjs.parentNode.insertBefore(js, fjs);
    }(document, 'script', 'facebook-jssdk'));  
    window.fbAsyncInit = function() {
     FB.init({
      appId      : appID,
      cookie     : true,  
      xfbml      : true,  
      version    : 'v2.0' 
    });
     fbReady = true;
   }   
 }

 this.setAppID = function(appID) {
  this.appID = appID;
};

this.$get = function() {
  var appID = this.appID;
  var self = this;
  fbInit(appID);

  return {
    graph : function(path, cb) {
      FB.api(path, function(response) {
        cb(response);
      });
    },
    getAuth: function() {
      return self.auth;
    },
    getLoginStatus: function(cb) {
      if (!fbReady) {
        setTimeout(function() { 
          self.$get()['getLoginStatus'](cb);
        } , 100);
        console.log('fb not ready');
        return;
      }
      FB.getLoginStatus(function(response) {
        cb(response);
      });
    },
    login: function(cb) {
      if (!fbReady) {
        self.$get()['login'](cb);
        console.log('fb not ready');
        return;
      }
      FB.login(function(response) {
        if (response.authResponse) {
          self.auth = response.authResponse;
          cb(self.auth);
        } else {
          console.log('Facebook login failed', response);
        }
      }, {"scope" : "manage_notifications"});

    },
    logout: function() {
      FB.logout(function(response) {
        if (response) {
          self.auth = null;
        } else {
          console.log('Facebook logout failed.', response);
        }

      });
    }
  }
}
});
稍后,当您想使用它时,只需在配置部分设置应用程序的ID:

app.config(function(facebookProvider){
 facebookProvider.setAppID('<your_app_id>');
})
然后在控制器/运行部分执行一些调用:

facebook.graph('/me/notifications', onNotificationsGotten);

谢谢你的回复,这非常非常有帮助,我的朋友。只有一件事:你知道我如何维护一个临时变量来指示某种加载状态吗?我看到你在Pluncker上使用了第一个名字,但是如果没有显示连接facebook WAN的按钮,我将永远不会得到这个变量。我不想强制登录到FB。Thanks。我不确定我是否理解这个问题,但请查看更新的Plunker。我添加了一个“已连接”标志,该标志最初设置为false,然后在有人登录时设置为true。如果回答了问题,请接受答复,谢谢。是的,这就是我的意思。你安装了相同的Plunker吗?我没有看到任何代码更新。不是吗请再次查看链接,抱歉,可能我需要保存更改。您应该看到,这两个HTML元素现在以“user.connected”为条件,并且此标志在应用程序代码中初始化和更新。尼斯解决方案应位于github上
facebook.graph('/me/notifications', onNotificationsGotten);