2017-03-15 28 views
-2

次のコードでは、最後のコールバックが更新された変数を返すことはできますか?ネストされた非同期関数

var a = 0; 
async.forEach(collectionarray, function(item, cb1) { 
    async.forEach(collection.anotherarray, function(item, cb2) { 
     a += item.number; 
     cb2(); 
    }, function(err) { 
     if(err) console.log(err); 
    }) 
    cb1(); 
}, function(err) { 
    if(err) console.log(err); 
    console.log(a); // will this be updated for all the collection.anotherarray.number ? 
}) 
+1

'cb1'をコールバックとして内部の' forEach'に渡し、すぐに呼び出さないことになっています! – Bergi

+0

@Bergiあなたは内側の非同期の最終的なコールバックの中でそれを呼び出すことを意味しますか? –

答えて

0

.forEachの3番目のパラメータは、二重の目的働く:すべての反復が完了し、又はエラーを報告するためにコールバックなどを。インナー.forEachにそのコールバックの内側cb1()を呼び出します。

var a = 0; 
async.forEach(collectionarray, function(item, cb1) { 
    async.forEach(collection.anotherarray, function(item, cb2) { 
     a += item.number; 
     cb2(); 
    }, function(err) { 
     if(err) console.log(err); 
     cb1(); 
    }); 
}, function(err) { 
    if(err) console.log(err); 
    console.log(a); 
}) 

あなたが書いたアプローチは、ほぼ間違いなく正常に動作しません。外側の.forEachはそれがあまりにも早く完了したと想定します。

関連する問題