Node.js中的并行函数调用

时间:2012-12-26 00:46:23

标签: javascript node.js function asynchronous

我需要在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()并在完成所有操作后立即发送响应。是否有一些非常简单和常见的方法来实现这一目标?

2 个答案:

答案 0 :(得分:12)

使用async package :( npm install async

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

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

或者,您可以使用promises

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

(假设get*()方法返回promises)

答案 1 :(得分:2)

您可以使用一个函数来检查是否所有数据都作为您的查询回调而存在,如果所有数据都存在,则可以发送响应。像

这样的东西
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();
}

当三人都完成后,您的回复将被发送。