Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/362.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/40.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 节点是否有使用/停止事件的方法?_Javascript_Node.js_Events_Eventemitter - Fatal编程技术网

Javascript 节点是否有使用/停止事件的方法?

Javascript 节点是否有使用/停止事件的方法?,javascript,node.js,events,eventemitter,Javascript,Node.js,Events,Eventemitter,我正在寻找一种添加事件的方法,这样它们就可以按顺序触发并可以选择通过。我想知道Node API中是否有类似的内容,或者是否有人知道一个体面的npm包可以实现这一点: obj .on('event-A', function(){ // log something() // consume or stop the event }) .on('event-A', function(){ // this never fires }); 我刚刚编写了一个库(),它

我正在寻找一种添加事件的方法,这样它们就可以按顺序触发并可以选择通过。我想知道Node API中是否有类似的内容,或者是否有人知道一个体面的npm包可以实现这一点:

obj
  .on('event-A', function(){
    // log something()
    // consume or stop the event
  })
  .on('event-A', function(){
    // this never fires
  });

我刚刚编写了一个库(),它复制了
EventEmitter
API,并通过拒绝承诺或调用
this.stop()
提供取消。还从
信号
中窃取了一个想法,您可以在其中使用“单事件”发射器。

我不知道有任何节点api允许取消事件调度。但您可以使用任何与节点兼容的事件库(节点、pubsubs等)并使用以下准则修改调度函数:

  • 将cancel函数作为this/first/last(选择您最喜欢的)参数传递给事件侦听器。cancel函数在闭包中有一个cancel属性,事件调度器将在分派事件之前检查该属性
但请注意:

  • 由于这是一个副作用,这会使您的程序更难推理。您必须记住所有发生副作用的地方,才能完全理解您的程序。此外,事件处理程序必须按顺序执行,这意味着您必须具有一致的顺序定义(注册侦听器的顺序,用户定义的顺序?)
很抱歉,当我在上看到
。时,我假设。我对node不是很熟悉,但如果没有内置的解决方案,那么事件是冻结还是密封的?如果没有,您可以添加一个已取消的属性来检查。要扩展此功能,您应该在
上更改events.EventEmitter.prototype.on,以检查是否已取消。@PaulS。--不用担心,我们都会犯错误:)不幸的是,当你触发一个事件时,没有一个“事件”被创建,所以没有什么可以依赖的。它只是通过任何争论。e、 g.
.trigger('a','b')
将调用
处理程序('a','b')
,而不是
处理程序(ev,'a','b')
或类似程序。谢谢,已经以类似方式重新编写了
EventEmitter
API。是的,现在刚刚看到了您之前的消息。我还认为您正在寻找的功能类似于express.js中使用的中间件,在express.js中,您在处理程序旁边传递一个函数,处理程序必须调用该函数才能将流传输到下一个处理程序。但我想你更多的是想表示流程的结束,而不是继续。对于其他可能会对这种模式感兴趣的人,我在这里引用一个库的例子,它允许你创建自己的中间件机制:,或者ES-6(使用生成器函数)更复杂。一旦定义了中间件链,就可以将其封装在感兴趣事件的侦听器中。然后你只定义一个监听器,而不是常规方法中的几个。是的,我试图确定哪个方向更有意义(拒绝还是继续),结果是拒绝模式,因为这是承诺的工作方式。我只是在承诺的基础上把排放链分层。