我必须在Node.js的循环中运行mysql查询,但我所知道的不能以我想要的方式完成。
这是我想要实现的目标:
for(var attributename in body){
sql.increaseValue(attributename, body[attributename]);
}
我去解析和JSON对象,其中我没有数字或属性的名称及其值。
我知道我需要使用某种回调模式。我读过很多关于此的文章,但在这种情况下,我无法继续前进
提前致谢
拉狄克
答案 0 :(得分:3)
我认为您想要的是知道所有这些操作何时结束?当循环结束?这可以通过多种方式实现。我假设您的.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是单线程的事实,你可以摆脱第二个循环,只需在{{1}后调用req( )
}}。但是,如果任何机会requests.push( req );
同步触发(例如,当发生错误或某事时),则可能导致.increaseValue
立即触发。所以要谨慎行事。
2)由于范围界定,您需要使用匿名函数包装finalize
定义。
3)看看caolan's Async.js library。它可能会帮助你解决这个问题。