高地在被完全消耗之前会增加流量吗?

时间:2018-07-24 16:15:40

标签: javascript stream highland.js

是否存在一种方法,可以在高地流中添加一条完整的信息,以完整地描述我们的需求?

假设我们有以下情况,

const stream = high([1,4,6,7])

然后使用此流,我要计算每个要处理的值,然后说

sink.drain(stream.pipe(4))

为数组元素的数量4。考虑到这可能是一个流中对象的数量之多,我需要从流中消耗掉才能计数。

我不能说array.length,因为它是可能包含任何信息的源,并且该信息正在与流一起处理...如何在流中添加消息末尾以及所消耗内容的描述?

1 个答案:

答案 0 :(得分:1)

听起来您想在值周围建立一些状态,但又不妨碍值的使用。我建议您看一些涉及h.through的解决方案。

您可以使用forkobserve分割流,并从值中减少一些状态:

h([1, 2, 3, 4])
  .through(stream => {
    const length = stream.observe()
      .reduce(0, m => m + 1)
      .map(length => ({ length }))

    return h([stream, length])
      .sequence()
  })
  .errors(err => console.error(err))
  .each(x => console.log(x))

您可以创建一些状态并根据源流的事件返回新流:

const h = require('highland')
h([1, 2, 3, 4])
  .through(stream => {
    let length = 0

    return h(push => stream
      .tap(() => ++length)
      .errors(err => push(err))
      .each(x => push(null, x))
      .done(() => {
        push(null, `length: ${length}`)
        push(null, h.nil)
      }))
  })
  .errors(err => console.error(err))
  .each(x => console.log(x))