2

このコードを見てください:

for(var k=0;k<pods.length;k++){
        var currentQueryList = new Array();
        currentQueryList[0]=pods[k].queryname;
        console.log("Hello :"+i);
        queryBuilderDWRService.getDataForAllPods(currentQueryList, {callback:function(map){
            podsDataMap = map;
            console.log("Hello"+k+":");
            var pod = pods[k];
            displayPod(k, pod, false);
        }});
    }

このコードでは、呼び出しqueryBuilderDWRService.getDataForAllPods()が実際のデータを返す前に for ループが完了しています。これは、データベースからデータを取得するために使用しています。

console.log("Hello"+i);DBからのデータなしで配列の長さまで印刷しようとHello :1, Hello :2, Hello :3, Helllo :4,すると、forループがqueryBuilderDWRService.getDataForAllPods()戻る前に実行を完了していることを意味します。

私が必要としているのは、コントロールが for ループに入ったら、queryBuilderDWRService.getDataForAllPods() の実行を完了する必要があり、それから次の反復が続くことができるということです。

前もって感謝します。

4

3 に答える 3

5

forループの代わりに「非同期疑似再帰」を使用できます。私が使用する一般的なパターンは次のとおりです。

var pods = [ ... ];

(function loop() {
    if (pods.length) {
        var pod = pods.shift();   // take (and remove) first element

        // do something with "pod"
        ...

        // recurse - put this inside a finish callback if "do something" is async
        loop();
     }
})();   // closing braces start invocation immediately

あなたの場合、への呼び出しはloopコールバック関数内の最後のものでなければなりません。


loop()注意: このパターンは、 への呼び出しをに置き換えることで、長時間実行されている非非同期操作で見られる「ブラウザーが応答していません」というエラーを回避するためにも使用できますsetTimeout(loop, 0)

をこのように使用するとsetTimeout、同期再帰関数が非同期疑似再帰関数に変わり、その過程でスタック オーバーフロー エラーの可能性が回避されます。

唯一の欠点は、反復間の最小遅延が 4 ミリ秒であることです。

于 2013-07-15T21:29:27.123 に答える