我假设您想要知道所有这些操作何时结束?循环何时结束?这可以通过多种方式实现。我假设您的.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 是单线程的这一事实,您可以摆脱第二个循环并简单地调用req( )
after requests.push( req );
。但是,如果有任何机会.increaseValue
同步触发(例如发生错误或其他情况时),那么这可能会导致finalize
立即触发。所以请谨慎行事。
2)由于作用域,您需要req
用匿名函数包装定义。
3) 看看caolan 的Async.js 库。它可能会极大地帮助您解决这个问题。