2

次のことを考慮してください

function firstFunction() {
  for ( var i = 0; i < 10; i++) 
    FB.api(apiPath,function(response) {
      secondFunction(response,i);
  });
}

function secondFunction(response,num) {
  alert(num);
}

secondFunction を非同期で 10 回呼び出し、そのたびに num で異なる数値を受け取るようにしたかったのです。代わりに、secondFunction が 10 回呼び出され、そのすべてで num は 10 です。

誰かが私に期待どおりに渡されない理由と、期待どおりに動作するように修正する方法を説明できますか?

ありがとう

4

2 に答える 2

4

最初の非同期コールバックが実行される前に、同期forループが 10 までインクリメントされます。iFB.api

このような:

function firstFunction() {
  for ( var i = 0; i < 10; i++) {
    (function(i2) {
      FB.api(apiPath,function(response) {
        secondFunction(response, i2);
      });
    })(i);
  }
}

この修正により、非同期関数呼び出しが独自の関数に配置されるためi、パラメーターとして渡すことができi、非同期コールバックが発生したときではなく、呼び出し時に の値を取得できます。

于 2013-01-25T19:15:16.813 に答える
0

これは、2 番目の関数が呼び出されるのは、サーバーが非同期呼び出しで応答を返し、ループが実行を継続する場合のみであり、サーバーが応答するまでに var I はすでに 10 になっているためです。

それを修正するには、最初の API に i 変数を渡してから 2 番目の API に渡すことができるトーンが必要なので、参照できます。

メソッドを 10 回ループさせるには、メソッドをリファクタリングする必要がある場合があります。

于 2013-01-25T19:23:01.540 に答える