0

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

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

我去解析和 JSON 对象,其中我没有编号或属性的名称,也没有它的值。我知道我需要使用某种回调模式。我已经阅读了很多关于此的文章,但在这种情况下,我无法继续
前进,提前感谢
Radek

4

1 回答 1

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 是单线程的这一事实,您可以摆脱第二个循环并简单地调用req( )after requests.push( req );。但是,如果有任何机会.increaseValue同步触发(例如发生错误或其他情况时),那么这可能会导致finalize立即触发。所以请谨慎行事。

2)由于作用域,您需要req用匿名函数包装定义。

3) 看看caolan 的Async.js 库。它可能会极大地帮助您解决这个问题。

于 2013-01-01T23:33:36.903 回答