如何等待所有节点流完成/结束?
Posted
技术标签:
【中文标题】如何等待所有节点流完成/结束?【英文标题】:How to wait for all node streams to finish/end? 【发布时间】:2016-06-15 21:10:47 【问题描述】:我有一个每 24 小时在 CRON 上运行一次的子节点进程。当该过程开始时,它会读取一些排队的数据并将这些数据推送到某个转换流中。然后,此流充当反向多路复用器并将流拆分为多个流,这些流最终解析,但它们都是异步的。
一旦所有这些流完成,我需要终止我创建的这个子进程。我的问题是,你怎么知道所有流何时结束?
尝试:
我曾尝试使用 EventEmitter 的 'finish' 事件,但似乎在第一个反向多路复用流完成时会被捕获(那是满口 :))。
基于承诺的方法。所以这种方法有效,但我认为有一种更简单的方法来做这样的事情。基本上,这导致为每个反向多路复用管道创建一个承诺,当每个管道完成时,我们解决该承诺。然后,当所有的 Promise 都完成后,就会触发一个事件,我们在其他地方捕获该事件以终止该过程。
【问题讨论】:
我建议研究 observables。 bacon 或 rxjs 应该这样做。 我用ramda-future
和parallel-future
模块运行和解决了多个子进程解决了类似的问题 - 非常 FP 方法。它类似于 promise,但由于子进程的任务运行/流本质上更具功能性,我更喜欢这种更清洁和更精简的方法。
【参考方案1】:
我会重新考虑您的第二个选项。请考虑以下代码,以便轻松地将您的列表映射到 Promise:
const promises = data.map((item) => functionThatReturnsPromise(item));
在你构造了 promise 之后,Promise.all 是一种执行多个 promise 并返回所有结果的方法。
Promise.all(promises)
.then(array_of_results => doStuff)
【讨论】:
以上是关于如何等待所有节点流完成/结束?的主要内容,如果未能解决你的问题,请参考以下文章
CFStreamCreateBoundPair 正在将 4kb 数据写入流,流将解析包含 xml 起始节点且不包含结束节点的数据