Answers
当然你可以手动去实现这个机制,在一个事件到达时设置某个状态比如
first_arrived=true
,第二个事件到达时检查
first_arrived
是否为
true
。这样来判断两个事件均已发生。
不过根据上面的描述你也发现这个过程的蛋疼了。工程上当然建议使用更加通用的机制。 @kikong 说的是一种办法, 如果你并不是为了实现事件扩展,而是简单的资源同步 ,可以引入Promise/Defered模式。Promise是用来管理异步资源的获取过程的,你可能需要学习一会才能上手。对于你的场景,实现代码可能是这样的:
var resource1 = Promise.pending(),
resource2 = Promise.pending();
watcher.on("event1", function(){
resource1.resolve();
});
watcher.on("event2", function(){
resource2.resolve();
});
Promise
.all([resource1, resource2])
.then(function(){
// do your job, or emit another event
event.emit("event_all");
});
悠闲大海龟
answered 9 years, 3 months ago
var util = require("util");
var events = require("events");
function JobWatch(jobNameList){
this.unfinishedJobList=jobNameList.slice(0);
}
util.inherits(JobWatch, events.EventEmitter);
JobWatch.prototype.notifyJobDone=function(jobName){
var jobIndex=this.unfinishedJobList[jobName];
if(jobIndex!==-1){
this.unfinishedJobList.slice(jobIndex,1);
}
if(unfinishedJobList.length===0){
this.emit('allJobDone');
}
}
新建JobWatch实例,传入需要监控的事件名列表
var jobWatch=new JobWatch(jobnames);
每次你的任务做完就调用jobWatch.notifyJobDone方法,传入事件名
jobWatch.on("allJobDone",function(){
//处理你的业务逻辑
});
如果需要传入每个事件的执行结果数据,改造下jobWatch的notifyJobDone方法就好
十字纹海豚
answered 9 years, 3 months ago