首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >NodeJS EventEmitter:如何等待所有事件完成?

NodeJS EventEmitter:如何等待所有事件完成?
EN

Stack Overflow用户
提问于 2022-03-30 21:02:22
回答 1查看 1.6K关注 0票数 1

得到一个类,它扩展了EventEmitter。

在发射器上触发了一堆事件。这些事件触发异步任务,并且它们都有一个done()回调。

等待所有任务完成的正确方法是什么?我只想让进程坐在那里,等待事件发生,直到某个事件被触发(ALL_DONE),在这种情况下,它应该退出。

我的意思是,我知道这可以通过多种方式完成,但我想问的是,我可以不使用任何包、插件等等,只使用nodeJS API吗?

我想在不阻塞主线程的情况下等待。

编辑:

回答是什么!我不确定这些是否适用于我的案子。我应该提供更多细节的。这就是我所拥有的:

代码语言:javascript
运行
复制
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永远不会被触发。

EN

回答 1

Stack Overflow用户

发布于 2022-03-30 21:56:15

似乎不应该比这样的事情更复杂:

代码语言:javascript
运行
复制
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);
});

或者,另一种方法:

代码语言:javascript
运行
复制
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();
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71684125

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档