2

Firefox拡張機能を構築し、グラフAPIを使用しています。現時点では、次のようなブラウザの起動中に各ユーザーのアクセストークンをキャッチします: https ://stackoverflow.com/questions/10301146/facebook-login-within-a-firefox-add-on

これは問題なく動作しますが、Firefoxの各セッションで誰も拡張機能を使用しないため、ちょっとばかげています。だから私がやろうとしているのは、アクセストークンをキャッチするか、より正確にはWladimirPalantがオンデマンドで推奨するメソッドを呼び出すことです。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()-メソッドは待機せずに続行することです。したがって、リクエストの送信中はNoteHandler.tokenはnullになります。私はjavascriptに比較的慣れていないので、誰かがアイデアを持っていますか?

4

1 に答える 1

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();
}
于 2012-05-09T19:23:37.063 に答える