node.js循环和数据库查询的问题

时间:2013-01-01 22:11:39

标签: node.js asynchronous express

我必须在Node.js的循环中运行mysql查询,但我所知道的不能以我想要的方式完成。
这是我想要实现的目标:

for(var attributename in body){
   sql.increaseValue(attributename, body[attributename]);
}

我去解析和JSON对象,其中我没有数字或属性的名称及其值。 我知道我需要使用某种回调模式。我读过很多关于此的文章,但在这种情况下,我无法继续前进
提前致谢
拉狄克

1 个答案:

答案 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。它可能会帮助你解决这个问题。