0

私は私がしなければならないアプリケーションを持っています

FB.api(/ me)FB.api(/ me / friends)。

ユーザーが認証されたら、window.location.href。(xx)を持つ新しいページにログインしたいと思います。

だから私のpesduocodeは:

checkuserdetails()
{
FB.api(/me)
FB.api(/me/friends).
window.location.href.(xx).

}

コールバック関数にアラートがありますが、アラートが実行されず、ページがリダイレクトされます。CBroeによって提案されたように、私はwindow.location.hrefを保持しました。カルバックで。しかし、それも問題を抱えています。

そのようなthiis:

pseduo code:
    checkuserdetails()
    {
    FB.api(/me)
    FB.api(/me/friends){    window.location.href.(xx).}.    
    }

友達のアラートが実行されることはありません。

pseduoコード:checkuserdetails(){FB.api(/ me){window.location.href。(xx)。}。FB.api(/ me / friends)

}

両方のアラートが実行されます。

私の質問:1)/ me / friendsからのアラートが最初に実行されることもあれば、/meで実行されることもあります。私はFBがutをシーケンシャルにする方法が非同期であることを理解しています...FB.api呼び出しがたくさんある場合(2つ以上)、windows.locationをどこに保持するのですか?非同期機能を制御する方法

4

1 に答える 1

2

すべてのAPI呼び出しは非同期であるため、これらすべてが完了した後に何かを実行する必要がある場合は、それらを直列に実行するか(perfには推奨されません)、同期と並行して実行する必要があります。

このために、Promises、Futuresなどのパターン、または次のような単純なものを使用できます。

var results = [], done = 0;
function allDone(d1, d2) {
  // do something with d1 and d2
}

FB.api('/...', {..}, function(data) {
  results[0] = data;
  if (done === 2) {
    allDone.apply(null, results);
  }
});

FB.api('/...', {..}, function(data) {
  results[1] = data;
  if (done === 2) {
    allDone.apply(null, results);
  }
});

もちろん、これはいくつかのヘルパー関数に抽象化できます。

于 2012-08-08T19:55:00.960 に答える