如何等待,直到多个EventEmitter实例在Node.js中发出相同的事件?

我正在研究一个Node.js模块/实用程序,这将允许我脚手架一些目录/文件。 长话短说,现在我有这样的主要function:

util.scaffold("FileName") 

这个“脚手架”方法返回一个EventEmitter实例,所以,当使用这个方法时,我可以做这样的事情:

 util.scaffold("Name") .on("done", paths => console.log(paths) 

换句话说,当所有的文件被创build时,事件“完成”将被发射与脚手架文件的所有path。

一切都很好迄今。

现在,我正在试图用这个方法做一些testing和基准testing,我试图find一个方法来执行一些操作(断言,日志等),这个“脚手架”方法已被多次调用不同的“名称”的说法。 例如:

 const names = ["Name1", "Name2", "Name3"] const emitters = names.map(name => { return util.scaffold(name) }) 

如果我正在返回Promise而不是EventEmitter,我知道我可以这样做:

 Promise.all(promises).then(()=> { //perform assertions, logs, etc }) 

但是,我不知道如何使用EventEmitter来做同样的事情。 换句话说,我需要等到所有这些发射器发出这个相同的事件(即“完成”),然后再执行另一个操作。

任何想法/build议如何做到这一点?

提前致谢。

随着promise.all你有一​​个独特的信息,当“一切”完成。 当然,这是所有的承诺内全部/拒绝。

如果你有一个EventEmitter,当“完成”完成时,这个信息不能存储在你的EventEmitter逻辑中,因为它不知道事件发生的地点或频率。

所以第一个解决scheme是pipe理一个外部状态“一切完成”,当这个更改为true时,执行其他操作。

就像promise.all一样,你必须环绕它。

我能想象的第二种方法是build立一个跟踪实例的EventEmitter的工厂。 那么这个工厂可以提供所有实例是否被触发的信息。 但是这种方法可能在许多层面上失败:一个实例 – >多个呼叫; 一个实例 – >没有呼叫; …

只是我5美分,我会很高兴看到另一种解决scheme

正如其他人所说,最简单的方法是返回promise而不是EventEmitter实例。 但是,根据您的问题,您可以编写done事件的callback,如下所示:

 const names = ['Name1', 'Name2', 'Name3'] let count = 0 util.scaffold('Name').on('done', (paths) => { count += 1 if (count < names.length) { // There is unfinished scaffolding } else { // All scaffolding complete } }) 

我最终做了@Gleepbuild议的事情,并将每个发射器包装在Promise中,如下所示:

 const names = ["Name1", "Name2", "Name3"] const promises = names.map(name => { return new Promise((resolve) => { util.scaffold(name).on("done", paths => { resolve(paths)}) }) }) // and then Promise.all(promises).then(result => { // more operations }) 

它似乎正在做我到目前为止所需要的,所以我现在就使用它。 感谢大家的反馈:)