用nodejs的events如何实现两个事件对应一个handler?


只有这两个事件都到时才执行handler的代码,这个要怎样实现?谢谢

node.js web JavaScript

花谢花飞花满天 9 years, 2 months ago

当然你可以手动去实现这个机制,在一个事件到达时设置某个状态比如 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, 2 months ago

用Promise.all来实现

帅气福小猫 answered 9 years, 2 months ago

NodeJS的原理 基于事件循环的机制
这也不是不行 你 在内存中 存个中间值 当个锁
两个钥匙 都凑齐了 你再去执行某个操作不就完了

妖恶山大王 answered 9 years, 2 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, 2 months ago

Your Answer