あなたが知りたいのは、これらすべての操作がいつ終了するかを知ることだと思いますか? ループが終了するときは?これは、複数の方法で実現できます。.increaseValue
メソッドが完了コールバックを受け入れると仮定します。その場合、擬似コードは次のとおりです。
var finalize = function( ) {
// for finalization after the loop
};
var requests = [];
for (var attributename in body) {
(function(attr){
var req = function() {
sql.increaseValue( attr, body[ attr ], function( ) {
var idx = requests.indexOf( req );
if (idx !== -1) {
requests.splice( idx, 1 );
}
if (!requests.length) {
finalize( );
}
} );
}
requests.push( req );
})(attributename);
}
// second loop
for (var i = 0; i < requests.length; i++) {
requests[i]( );
}
注目すべき点は次のとおりです。
1).increaseValue
が真に非同期である場合、NodeJS がシングルスレッドであるという事実を利用でき、2 番目のループを取り除き、単にreq( )
afterを呼び出すことができますrequests.push( req );
。ただし、万が一.increaseValue
同期して発火した場合 (たとえば、エラーが発生した場合など)、finalize
すぐに発火する可能性があります。したがって、これは慎重に行ってください。
req
2)スコープのため、無名関数で定義をラップする必要があります。
3) caolan の Async.js ライブラリを見てください。この問題で大いに役立つかもしれません。