3

別の関数内にある forEach ループ内に ajax 呼び出しがあります。問題は、内側のループが終了する前に外側の関数のコールバックが起動することです。そのため、コールバックに渡されたときに「staticItemList」がアイテムで満たされません。どうすれば修正できますか?私は本当にそれに多くの時間を費やしました。ありがとう。

  exports.buildTheList = function (parsedList, callback) {
        var staticItemList = {};
        parsedList.forEach(function(parsedItem) { 

                db.staticList.find({"_id":parsedItem.ID}).forEach(function(err, doc) {
                    if (!doc){
                        console.log("newStaticItem not found in db");
                        parsedDataFetcher.fetchParsedDetails(Path, function(parsedDetails){
                            staticItemList["_id"] = parsedItem.ID;
                            staticItemList[parsedItem.ID] = {
                                    "_id": parsedItem.ID,
                                    "type": parsedItem.type,
                                     } 
                                 })

                             }else {
                                   console.log("newStaticItem already found in db");
                             } 
                 });
             });


         callback(staticItemList);
     }
4

3 に答える 3

5

ループ内にカウンター変数を追加し、非同期メソッドが完了するたびに減少させます。カウンターがゼロになったら、コールバックを呼び出します。擬似コード:

 var counter = 0;
 foreach(function() {
     counter++;
     doAsync(function() {
           // add to list

           counter--;
           if (counter === 0) {
               callback(list);
           }
     });
 }

それが役立つことを願っています。

于 2012-11-26T20:31:04.510 に答える
1

Dojo promise のようなものを見たいと思いますall。マニュアルから:

dojo/promise/all複数の Promise を受け取り、すべての Promise が満たされたときに満たされる新しい Promise を返す関数です。

そのページの例は、必要なことを行う方法を示しています。

于 2012-11-26T20:36:54.093 に答える
0

AJAX は非同期で発生するため、ループが実行され、すべての AJAX 呼び出しがトリガーされ、完了してコールバックが呼び出されます。おそらく、foreach ループにある種のカウンターを実装し、各 AJAX 呼び出しの完了時にそれを確認する必要があります。完了した AJAX 呼び出しの数がカウンターの数と同じである場合は、非同期関数コンテキスト内からコールバック関数を実行します。

于 2012-11-26T20:34:32.543 に答える