JS节点异步处理事件

时间:2011-05-21 20:34:18

标签: mongodb asynchronous node.js

有人可以指出或解释某种基于事件的设计模式,处理等待两个事件完成以执行操作的情况。
我有一个加载异步的模板和一个同时发生的数据库调用。我有一个响应,只有当这两个任务都完成时才需要执行。
我能想出的唯一解决办法是做一些丑陋的事情,比如在事件结束时设置为true的布尔值,然后检查看看他们是否都是真的。有更好的方法吗?

2 个答案:

答案 0 :(得分:8)

只是添加Chris的回答中的一个例子:

使用async,https://github.com/caolan/async

async.parallel([
    function(callback){
        // query a database, lets say mongodb/mongoose
        User.findOne({email: email}, function(err, user){
            callback(err, user);
        });
    },
    function(callback){
        // Load a template from disk
        fs.readFile('views/user.html', function (err, data) {
            callback(err, data)
        });
    }
], function(err, results){
    // Should have [user, template data]
});

或者使用计数器:

var user     = false,
    template = false,
    count    = 2;

function build_user_view(){
    // user, template should be available
}

User.findOne({email: email}, function(err, userDoc){
    user = userDoc;
    --count || build_user_view();
});


fs.readFile('views/user.html', function (err, data) {
    template = data;
    --count || build_user_view();
});

答案 1 :(得分:3)

没有简单的方法可以做到这一点,但有很多flow control libraries可以处理这类事情。最简单的方法可能是保持一个全局计数器在启动异步调用时递增,然后在回调完成时递减。每个操作都可以在完成后检查计数器,如果它为零则触发响应,这取决于两者都完成。