有人可以指出或解释某种基于事件的设计模式,处理等待两个事件完成以执行操作的情况。
我有一个加载异步的模板和一个同时发生的数据库调用。我有一个响应,只有当这两个任务都完成时才需要执行。
我能想出的唯一解决办法是做一些丑陋的事情,比如在事件结束时设置为true的布尔值,然后检查看看他们是否都是真的。有更好的方法吗?
答案 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可以处理这类事情。最简单的方法可能是保持一个全局计数器在启动异步调用时递增,然后在回调完成时递减。每个操作都可以在完成后检查计数器,如果它为零则触发响应,这取决于两者都完成。