如何等待所有节点流完成/结束?

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-futureparallel-future 模块运行和解决了多个子进程解决了类似的问题 - 非常 FP 方法。它类似于 promise,但由于子进程的任务运行/流本质上更具功能性,我更喜欢这种更清洁和更精简的方法。 【参考方案1】:

我会重新考虑您的第二个选项。请考虑以下代码,以便轻松地将您的列表映射到 Promise:

const promises = data.map((item) => functionThatReturnsPromise(item));

在你构造了 promise 之后,Promise.all 是一种执行多个 promise 并返回所有结果的方法。

Promise.all(promises) .then(array_of_results => doStuff)

【讨论】:

以上是关于如何等待所有节点流完成/结束?的主要内容,如果未能解决你的问题,请参考以下文章

for循环和mysql节点如何等待所有查询完成处理视图

Selenium 延时等待

如何等待Jenkinsfile“并行”块内的所有执行程序?

CFStreamCreateBoundPair 正在将 4kb 数据写入流,流将解析包含 xml 起始节点且不包含结束节点的数据

如何在节点 js 中正确使用等待/异步与 for 循环

如何等待 stream.write() 循环结束