1

caolan の async.jsを使用しています。すべてのイテレータが完了する前にコールバックが呼び出される理由がわかりません。次のコードを実行すると:

  async.filter(matched_objects.fields, function(item, callback) {
      console.log('checking field: ' + item.id);
      if(item.id == 130 || item.id == 131) {
        console.log('calling field true: ' + item.id);
        callback(true);
      } 
      callback(false);
    },
    function(fieldResults) {
      console.log('fieldsResults.length=' + fieldResults.length);
    });

次の出力が得られます。

checking field: 130 
calling field true: 130 
fieldsResults.length=1 
checking field: 131
calling field true: 131 

results.fieldsフィルター ループで 2 番目の項目がチェックされる前に、コールバックの console.log が呼び出されることは私には意味がありません。

4

2 に答える 2

6

問題はcallback(false)、条件にヒットした場合でも、毎回呼び出されることですif。正しいアプローチは、次のreturnステートメントを追加することです。

if(item.id == 130 || item.id == 131) {
  console.log('calling field true: ' + item.id);
  return callback(true);  // now you won't call callback(false) everytime
} 
callback(false); 

また、次のように言ってフィルターを短くすることもできます。

callback(item.id == 130 || item.id == 131);
于 2013-10-29T21:26:36.883 に答える
0

さらに実験を重ねた結果、問題は callback(false); であることがわかりました。ライン。明らかに、これによりフィルターが終了しました。コールバックを強制的に呼び出すので、これは理にかなっていると思います。

于 2013-01-15T19:47:44.320 に答える