您是否曾经尝试过从自然界导出方程式? 没有? 好吧,让我们用上面的图像进行练习。 您会看到2条溪流,它们似乎正在流入湖中。最简单的答案是stream + stream = lake。
现在,如果我们将该想法应用到代码中怎么办? 2个彼此独立的流汇聚成一个更大的整体。 每条溪流都有其自己的职责,名称和游鱼路线。 它们是如此独立,以至于您可以将垃圾倒在左流中,而没有一个香蕉皮污染右流。 完全分离职责,同时仍然有助于更大的整体。 真是个好主意。
实际上,这个想法已经存在了一段时间。 这就是所谓的并发。
并发是程序某些部分忽略其执行顺序的能力。没有严格的顺序意味着程序的某些部分可以移交给其他CPU内核。 在您的程序上运行的CPU内核越多,它运行的速度和可伸缩性就越高。 如果您想了解更多信息,请观看Rob Pike的演讲:https://vimeo.com/49718712。 流是我们最有用的Node.js并发工具之一。
Node.js流是一次一次大块传递数据的对象。 它们通常用于处理超过Nodejs内存限制(即> 2GB)的大型数据集。 让我们以尝试计算麦克白夫人在麦克白中讲话的行数为例。 无需将整个剧本读入内存,而是使用流将段落传递给函数来检查Macbeth女士正在讲话。 这样,您就不必担心Act.4中途Node.js的内存溢出。
这两个想法听起来都很棒。 但是,如何将它们结合起来? 您如何获得并发的Node.js流(滚动积分)?
好吧,您必须添加另一个范例Promises。 JavaScript开发人员使用Promises控制异步操作的顺序。 他们使用内置的事件侦听器( .then ()和.catch() ),这使我们仅在异步操作成功完成(未成功)时运行代码。
关键字提示 :Promise触发它的.then()挂钩时,它会解决 ;当它触发.catch()挂钩时,它会拒绝。
Promise也有一个很棒的方法Promise.all() 。 Promise.all()接收一组Promises,然后等待每个Promises解析或拒绝。 完成后,您可以对结果和/或错误进行任何操作。
听起来很熟悉,不是吗? 它实际上是并发的JavaScript实现!
在下面,您可以看到函数stream2Prom() 。 stream2Prom()获取给定的流,将其包装在新的Promise中,然后向该流添加2个事件侦听器。 流结束后 , “结束”事件侦听器将解析承诺。 如果有任何错误,“错误”事件侦听器将拒绝承诺,并传递错误。
在stream2Prom下面是一个名为stream2PromAll的函数。 此功能是真正的并发魔术。 它需要一个流数组,使用stream2Prom将它们转换为Promise,最后同时运行它们。 等待流完成,然后使用结果!
现在,我已经向您展示了如何构建并发Node.js流,开始吧! 我很想听听您在以下评论中构建的内容。