得到一个类,它扩展了EventEmitter。
在发射器上触发了一堆事件。这些事件触发异步任务,并且它们都有一个done()回调。
等待所有任务完成的正确方法是什么?我只想让进程坐在那里,等待事件发生,直到某个事件被触发(ALL_DONE),在这种情况下,它应该退出。
我的意思是,我知道这可以通过多种方式完成,但我想问的是,我可以不使用任何包、插件等等,只使用nodeJS API吗?
我想在不阻塞主线程的情况下等待。
编辑:
回答是什么!我不确定这些是否适用于我的案子。我应该提供更多细节的。这就是我所拥有的:
class FoobarEmitter extends EventEmitter {
protected checkEventStatus() {
// this has some logic to check if all done() callbacks have been called or not.
if(allDone) {
this.emit('ALL_DONE')
}
}
protected fireEvents() {
for() {
this.emit('SOME_EVENT', () => {})
this.checkEventStatuses();
}
}
protected registerHandlers() {
this.on('SOME_EVENT', async (done) => {
// does async stuff
// might also call this.emit('OTHER_EVENT', () => {})
done();
})
this.on('ALL_DONE', () => { process.exit() })
}
constrcutor() {
this.registerHandlers();
this.fireEvents()
}
}
new FoobarEmitter()因此,这将不会等待所有事件。从回调中发射的那些不会结束的。其中一些是运行的,然后进程就会停止,ALL_DONE永远不会被触发。
发布于 2022-03-30 21:56:15
似乎不应该比这样的事情更复杂:
const { once, EventEmitter } = require("events");
class FooBarEmitter extends EventEmitter {
}
async function doSomethingUseful( emitter ) {
// does something useful, emitter emits events in the process
}
async function main() {
const emitter = new FooBarEmitter();
const promise = doSomethingUseful(emitter) ;
await once(emitter, "ALL_DONE");
await promise;
}
let cc;
main()
.then( () => {
console.log(
cc = 0;
})
.catch( err => {
console.error(err.stack);
cc = 1;
})
.finally( () => {
process.exit(cc);
});或者,另一种方法:
const { once, EventEmitter } = require("events");
class FooBarEmitter extends EventEmitter {
}
async function doSomethingUseful( emitter ) {
// does something useful, emitter emits events in the process
}
function main() {
let promise;
const emitter = new FooBarEmitter().on('ALL_DONE', async () => {
await promise;
});
promise = doSomethingUseful(emitter) ;
}
main();https://stackoverflow.com/questions/71684125
复制相似问题