扫码关注官方订阅号
只有这两个事件都到时才执行handler的代码,这个要怎样实现?谢谢
ringa_lee
用Promise.all来实现
当然你可以手动去实现这个机制,在一个事件到达时设置某个状态比如first_arrived=true,第二个事件到达时检查first_arrived是否为true。这样来判断两个事件均已发生。
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"); });
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方法就好
NodeJS的原理 基于事件循环的机制这也不是不行 你 在内存中 存个中间值 当个锁 两个钥匙 都凑齐了 你再去执行某个操作不就完了
微信扫码关注PHP中文网服务号
QQ扫码加入技术交流群
扫描下载App
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号
PHP学习
技术支持
返回顶部
用Promise.all来实现
当然你可以手动去实现这个机制,在一个事件到达时设置某个状态比如
first_arrived=true
,第二个事件到达时检查first_arrived
是否为true
。这样来判断两个事件均已发生。不过根据上面的描述你也发现这个过程的蛋疼了。工程上当然建议使用更加通用的机制。@kikong 说的是一种办法,如果你并不是为了实现事件扩展,而是简单的资源同步,可以引入Promise/Defered模式。Promise是用来管理异步资源的获取过程的,你可能需要学习一会才能上手。对于你的场景,实现代码可能是这样的:
新建JobWatch实例,传入需要监控的事件名列表
var jobWatch=new JobWatch(jobnames);
每次你的任务做完就调用jobWatch.notifyJobDone方法,传入事件名
jobWatch.on("allJobDone",function(){
});
如果需要传入每个事件的执行结果数据,改造下jobWatch的notifyJobDone方法就好
NodeJS的原理 基于事件循环的机制
这也不是不行 你 在内存中 存个中间值 当个锁
两个钥匙 都凑齐了 你再去执行某个操作不就完了