【问题标题】:how to avoid promise rejection when firing 'error' event with EventEmitter in nodejs?在nodejs中使用EventEmitter触发“错误”事件时如何避免承诺拒绝?
【发布时间】:2016-02-03 19:16:57
【问题描述】:

我的代码看起来像

var EventEmitter = require('events');

class MyClass extends EventEmitter{
    doSomething(){
        this.emit('error', new Error('this is why') );
    }
}


function doSomethingAsync(){
    return new Promise( (resolve,reject) =>{
        new MyClass().doSomething();
        resolve();
    });

}


process.on('unhandledRejection', function(reason){
    console.error('unhandled rejection', reason, reason.stack);
});


setTimeout( doSomethingAsync,1);

如果我没有为myClass.on('error', ()=>{ ... }) 分配error 事件处理程序,则在引发error 事件并且doSomething 流被中断时会触发unhandledRejection 处理程序(我看不到@987654328 @ 打印) 如果我添加一个处理程序,一切正常(我确实看到了after 打印)。

我怎样才能避免这种情况?为什么“错误”事件会导致 Promise 被拒绝?

有时我不在乎事件发射器是否抛出错误事件。但我会一直在意承诺是否失败。 这是错的吗?我应该对他们一视同仁吗?

使用 nodejs 4.2.1

编辑

好的,所以我了解到节点以一种特殊的方式处理未处理的“错误”,如果未处理它会抛出异常。

https://strongloop.com/strongblog/robust-node-applications-error-handling/

有办法解决吗?我不明白为什么在 nodejs 中选择这种实现是正确的。

不应该有一个像unhandledErrorEvent 这样的全局处理程序吗?就像他们添加到unhandledRejection一样?

【问题讨论】:

  • 你能给我们提供一个完整的例子来重现这个问题吗?
  • 我会试试的。给我一秒钟。
  • @Ginden done.. 查看更新的问题代码 sn-p

标签: node.js es6-promise


【解决方案1】:

我同意,这很烦人,我将在 Node 核心中进一步调查。

与此同时,您可以使用emitter.listeners(name) 来检查听众,这实际上已经足够好了。

if (this.listeners('error').length > 0) this.emit('error', err)

我觉得你的问题很好。

【讨论】:

  • 面临同样的问题。我通过在 eventEmitter 实例化之后添加 .on("error", ()=>{}) 来解决它。
猜你喜欢
  • 2017-12-29
  • 2022-12-04
  • 2020-06-06
  • 2013-10-09
  • 2018-04-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多