JS节点异步处理事件

Mag*_*ero 5 asynchronous mongodb node.js

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

Jos*_*osh 8

只是添加一个克里斯回答的例子:

使用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]
});
Run Code Online (Sandbox Code Playgroud)

或者用柜台:

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();
});
Run Code Online (Sandbox Code Playgroud)


Chr*_*tow 3

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