7

Node.js でいくつかの独立したデータベース クエリを実行する必要があります。すべてのクエリが実行された後、応答が送信されます。私の最初の試みは次のようになります。

templateData = {};

model.getA(function(result) {
    templateData.A = result;

    model.getB(function(result) {
        templateData.B = result;

        model.getC(function(result) {
            templateData.C = result;

            response.send('template', templateData);
        })
    })
});

もちろん、Node.js でのこのアプローチはまったく適切ではありません。すべての関数が順次呼び出され、非同期プログラミング パターンの利点が失われているからです。私は Node.js を初めて使用しますがgetA()、を呼び出す方法getB()getC()、すべてが終了した直後に並行して応答を送信する方法がまだ不明です。これを達成するための本当に簡単で一般的な方法はありますか?

4

2 に答える 2

14

非同期パッケージを使用する:( npm install async

async.parallel([
    function(){ ... },
    function(){ ... }
], callback);

https://github.com/caolan/async#parallel

または、 promiseを使用することもできます。

Q.spread(
    [ model.getA(), model.getB(), model.getC() ],
    function(a, b, c) {
        // set templateData
        return templateData;
    }
).then(...);

get*()(メソッドがpromiseを返すと仮定します)

于 2012-12-26T00:50:39.150 に答える
3

クエリへのコールバックとしてすべてのデータが存在するかどうかをチェックする関数を使用するだけで、すべてのデータが存在する場合は応答を送信できます。だから何かのような

function checkData(){
    if (templateData.A && templateData.B && templateData.C){
        //send your response
    }
}

その後、あなたの電話を入れ子にしないでください

model.getA(function(result){
    templateData.A = result;
    checkData();
}

model.getB(function(result){
    templateData.B = result;
    checkData();
}

model.getC(function(result){
    templateData.C = result;
    checkData();
}

3つすべてが完了すると、応答が送信されます。

于 2012-12-26T00:59:15.720 に答える