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 がシングルスレッドであるという事実を利用でき、2 番目のループを取り除き、単にreq( )afterを呼び出すことができますrequests.push( req );。ただし、万が一.increaseValue同期して発火した場合 (たとえば、エラーが発生した場合など)、finalizeすぐに発火する可能性があります。したがって、これは慎重に行ってください。

req2)スコープのため、無名関数で定義をラップする必要があります。

3) caolan の Async.js ライブラリを見てください。この問題で大いに役立つかもしれません。

于 2013-01-01T23:33:36.903 に答える