按需抓住Facebook Access令牌,但如何?

时间:2012-05-09 18:25:43

标签: javascript facebook firefox firefox-addon xul

我构建了一个Firefox扩展,我正在使用图形api。目前,我在启动浏览器时捕获每个用户的访问令牌,如: https://stackoverflow.com/questions/10301146/facebook-login-within-a-firefox-add-on

这很好但有点愚蠢,因为没有人会在每个firefox会话中使用扩展。所以我想要做的是,捕获访问令牌或更准确地调用方法Wladimir Palant推荐的方法。我的代码看起来像这样,而getAccessToken()是提到的方法。

onLoad: function (){
   var NoteHandler = window.arguments[0];
   var sjcl = NoteHandler.sjcl;
   NoteHandler.getAccessToken();
   decryptionDialog.noteHandler = NoteHandler;
   decryptionDialog.sjcl = sjcl;

   var currID = decryptionDialog.getID();

   if(currID==""){
      window.close();
      return false;
     }else{             
       http_request = new XMLHttpRequest();   
       http_request.open('Get', 'https://graph.facebook.com/'+currID+'/notes?access_token='+NoteHandler.token, false);
       http_request.overrideMimeType("text/json");
       http_request.send(null);

       decryptionDialog.value = decryptionDialog.ResponseToArray(http_request.responseText);
....

但问题是当getAccessToken()仍在等待访问令牌时,onLoad() - Method将不会等待并继续。因此,在发送请求时,NoteHandler.token为null。有没有人有想法,因为我对javascript相对较新。

1 个答案:

答案 0 :(得分:0)

您应该将此代码重写为异步 - 它不应该假设getAccessToken()将立即获得结果,应该有一个回调参数,一个在操作完成时调用的函数(可以是封闭功能)。这些方面的东西:

onLoad: function (){
   var NoteHandler = window.arguments[0];
   var sjcl = NoteHandler.sjcl;
   NoteHandler.getAccessToken(function()
   {
       decryptionDialog.noteHandler = NoteHandler;
       decryptionDialog.sjcl = sjcl;

       ...

       http_request.open('Get', 'https://graph.facebook.com/'+currID+'/notes?access_token='+NoteHandler.token, false);

       ...
   });
}

...

getAccessToken: function(callback) {
    ...

    // All done - call the callback
    callback();
}