2011-12-18 29 views
2

node.jsで複数の同時操作を処理する最良の方法が何か不思議です。例えば、あるHTTP要求が3つのデータベースクエリを作成してから応答を出す必要があるが、それぞれの要求が独立しているとします。私の現在の素朴な実装はNode.jsでの複数の同時操作

doRequest1(query, function (response1) { 
    doRequest2(someQuery, function (response2) { 
     doRequest3(someQuery, function (response3) { 
      renderHTML(response1,response2,response3); 
     }); 
    }); 
}); 

(擬似コードで)このように動作しますこれを行うには良い方法はありますか?各クエリーへの応答が次のクエリーの開始を待つのは無駄に思えます。

答えて

7

あなたは非同期

https://github.com/caolan/async

またはステップ

https://github.com/creationix/step

編集のように、フロー制御ライブラリを使用する必要があります:あなたの場合は、非同期

async.parallel([ 
    function(callback){ 
     doRequest1(query, callback); 
    }, 
    function(callback){ 
     doRequest2(query2, callback); 
    }, 
    function(callback){ 
     doRequest3(query3, callback); 
    }, 
], 
function(err, results){ 
    if (err) { 
     renderError(err); 
    } else { 
     renderHTML(results[0], results[1], results[2]); 
    } 
}); 

と例を追加しましたそれぞれを作りたい(以前の関数が完了するのを待ちます)、async.parallelの代わりにasync.seriesを使用することができます。クエリが以前のクエリの結果に依存する場合は、async.waterfallを使用できます。クエリ間に複雑な依存関係グラフがある場合、async.autoを使用できます。

7

Gruikyaの答えはここでは、シーンの背後にどのように動作するかだ、あなたは何をすべきかを述べ:

var unfinished = 3 
var noop = function() {} 
var data1, data2, data3 
doRequest1(query1, function(err, results) { 
    if (err) return cb(err), cb = noop 
    data1 = results 
    if (--unfinished === 0) done() 
} 
doRequest2(query2, function(err, results) { 
    if (err) return cb(err), cb = noop 
    data2 = results 
    if (--unfinished === 0) done() 
} 
doRequest3(query3, function(err, results) { 
    if (err) return cb(err), cb = noop 
    data3 = results 
    if (--unfinished === 0) done() 
} 
function done() { 
    // do stuff with the data here 
    cb(null) // everything ok 
} 
関連する問題