高地的循环数据流

时间:2015-08-24 21:34:22

标签: node.js highland.js

我在NoFlo.js的鼓舞下学习了highland.js。我希望能够以递归方式运行流。在这个人为的例子中,我将提供一个乘以2的数字,我们过滤结果< = 512.一旦数字相乘,它就会被反馈到系统中。我的代码有效,但如果我在管道中取出doto函数,它不会处理任何数字。我怀疑我是否错误地将数据发送回returnPipe。有没有更好的方法将数据传回系统?我错过了什么?

###
  input>--m--->multiplyBy2>---+
          |                   |
          |                   |
          +---<returnPipe<----+
###

H = require('highland')

input = H([1])
returnPipe = H.pipeline(
  H.doto((v)->console.log(v))
)
H.merge([input,returnPipe])
 .map((v)-> return v * 2)
 .filter((v)-> return v <= 512)
 .pipe(returnPipe)

1 个答案:

答案 0 :(得分:5)

从文档中dotore-emitting the source stream时旋转流。这意味着就管道而言,有一个函数仍在通过它传递流。如果您取出doto,则原始流在下一次迭代时不会通过返回流返回。

如果要使用管道,则必须向其传递一个获取流并发出流的方法。例如,您可以在调用doto时使用H.map((v)=>{console.log(v); return v;})替换H.pipeline方法,因为该方法会消耗流并发出流,当流在.pipe(returnPipe)

上传回时,它将继续流动

编辑:要回答您的问题,当您声明let input = H([1])时,您实际上正在创建一个流。您可以删除对管道和returnPipe的任何引用,并使用以下代码生成相同的输出:

let input = H([1]);

input.map((v)=> {
  return v * 2;
})
.filter((v)=> {
  if (v <= 512) {
    console.log(v);
  }
  return v <= 512;
})
.pipe(input);