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

Javascript 如何等待多个EventEmitter实例在Node.js中发出相同的事件?,javascript,node.js,eventemitter,Javascript,Node.js,Eventemitter,我正在开发一个Node.js模块/实用程序,它允许我构建一些目录/文件。长话短说,现在我的主要功能如下: util.scaffold("FileName") util.scaffold("Name") .on("done", paths => console.log(paths) Promise.all(promises).then(()=> { //perform assertions, logs, etc }) const names = ["Name1", "Name2"

我正在开发一个Node.js模块/实用程序,它允许我构建一些目录/文件。长话短说,现在我的主要功能如下:

util.scaffold("FileName")
util.scaffold("Name")
.on("done", paths => console.log(paths)
Promise.all(promises).then(()=> {
//perform assertions, logs, etc
})
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
})
此“scaffold”方法返回一个EventEmitter实例,因此,使用此方法时,我可以执行以下操作:

util.scaffold("FileName")
util.scaffold("Name")
.on("done", paths => console.log(paths)
Promise.all(promises).then(()=> {
//perform assertions, logs, etc
})
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
})
换句话说,当创建所有文件时,事件“done”将与脚手架文件的所有路径一起发出

到目前为止一切都很好

现在,我正试图用这个方法做一些测试和基准测试,并且我正试图找到一种方法,在这个“scaffold”方法用不同的“name”参数多次调用之后,执行一些操作(断言、日志等)。例如:

const names = ["Name1", "Name2", "Name3"] 
const emitters = names.map(name => {
return util.scaffold(name)
})
如果我回报的是一个承诺,而不是一个EventEmitter,我知道我可以这样做:

util.scaffold("FileName")
util.scaffold("Name")
.on("done", paths => console.log(paths)
Promise.all(promises).then(()=> {
//perform assertions, logs, etc
})
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
})
但是,我不确定如何使用EventEmitter实现等效功能。换句话说,我需要等待所有这些发射器发出相同的事件(即“完成”),然后执行另一个操作

如何实现这一目标,有什么想法/建议吗


提前谢谢

承诺。当“一切”都完成时,你就有了唯一的信息。 当然,也就是说,里面的所有承诺都被完全归档/拒绝了

如果您有一个EventEmitter,“一切”完成时的信息不能存储在EventEmitter逻辑中,因为它不知道事件发生的位置或频率

所以第一个解决方案是管理外部状态“所有已完成的事情”,当这个更改为true时,您将执行其他操作

就像承诺一样,你要做的就是围绕它

我可以想象的第二种方法是一个工厂,在那里您可以构建跟踪实例的EventEmitter。然后,该工厂可以提供是否已触发所有实例的信息。但这种方法可能在许多层面上失败:一个实例->多个调用;一个实例->无呼叫


就我的5美分,我很高兴看到另一个解决方案

正如其他人所提到的,最简单的方法是回报承诺而不是实例。但是,根据您的问题,您可以为
done
事件编写回调,如下所示:

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
  }
})
const names=['Name1','Name2','Name3']
让计数=0
util.scaffold('Name')。on('done',(路径)=>{
计数+=1
如果(计数<名称.长度){
//还有未完工的脚手架
}否则{
//所有脚手架已完成
}
})

我最终按照@theGleep的建议做了,并将每个发射器包装在一个承诺中,如下所示:

util.scaffold("FileName")
util.scaffold("Name")
.on("done", paths => console.log(paths)
Promise.all(promises).then(()=> {
//perform assertions, logs, etc
})
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
})

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

你能不能用承诺来包装事件发射器,并在承诺中使用这些承诺。all()?你完全正确,这比我最初想象的要简单。