javascript 如何捕获在“emit”上运行异步函数的eventEmitter上的错误?

d5vmydt9  于 2023-03-06  发布在  Java
关注(0)|答案(4)|浏览(168)

我在async functions上捕获错误时遇到了一些问题,这些错误是由emit上的eventEmitter运行的。
下面是代码:

const EventEmitter = require('events')

const eventEmitter = new EventEmitter()
eventEmitter.addListener('callSyncFunction', syncFunction)
eventEmitter.addListener('callAsyncFunction', asyncFunction)

function syncFunction() {
    throw new Error('Sync function error')
}

async function asyncFunction() {
    throw new Error('Async function error')
}

try {
    eventEmitter.emit('callSyncFunction')
} catch(e) {
    console.log(e)
}
// Works and prints 'Sync function error'

try {
    eventEmitter.emit('callAsyncFunction')
} catch(e) {
    console.log(e)
}
// Does not  work and gives an Unhandled promise rejection

我可以在eventEmitter调用同步函数时捕获错误,但无法在异步函数运行时捕获错误。根据www.example.com上的建议,我尝试启用captureRejections: true,但它仍然无助于捕获这些错误。https://nodejs.org/api/events.html#events_capture_rejections_of_promises I tried enabled captureRejections: true but it still does not help capture those errors.
除了使用像emittery这样的库之外,还有什么解决方案吗?

zhte4eai

zhte4eai1#

不能使用nodejs EventEmitter从异步侦听器捕获错误。emit方法是完全同步的。设置capture Rejections: true只允许您通过error事件捕获异步错误。您应该为此使用一些第三方库,例如EventEmitter2

abithluo

abithluo2#

为什么不创建一个 Package 器监听器并在其中解析Async函数

function WrapperListener(){
    asyncFunction().then(result=>{
            //dosomething
        }).catch(e=>{
           console.log(e)
    })
}
62lalag4

62lalag43#

我最终使用这个 Package 器来实现我的目的:events-async.

csga3l58

csga3l584#

很简单,使用'error'事件:

给定

const EventEmitter = require('events')

const eventEmitter = new EventEmitter({ captureRejections: true });
eventEmitter.on('callSyncFunction', ()=>{
    throw new Error('Sync function error')
})
eventEmitter.on('callAsyncFunction', async ()=>{
    throw new Error('Async function error')
})

GIVEN:错误处理

eventEmitter.on('error', (e)=>{
    console.log("Error caught: ", e.message)
})

何时

eventEmitter.emit('callAsyncFunction')
eventEmitter.emit('callAsyncFunction')

然后

预期控制台输出:

Error caught: Sync function error
Error caught: Async function error

相关问题