javascript - 用nodejs的events如何实现两个事件对应一个handler?
ringa_lee
ringa_lee 2017-04-10 15:46:06
[JavaScript讨论组]

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

ringa_lee
ringa_lee

ringa_lee

全部回复(4)
PHP中文网

用Promise.all来实现

黄舟

当然你可以手动去实现这个机制,在一个事件到达时设置某个状态比如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");
    });
PHPz
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中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习
PHP中文网抖音号
发现有趣的

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号