0

所以,我有一个代码来模拟这个问题:

const H = require('highland');
const Promise = require('bluebird');

let i = 0
const stream = H(function(push, next) {
  console.log('read', i)
  push(null, i)
  i++;
  Promise.delay(100).then(() => next())
})


stream
  .flatMap(function(x) {
    console.log('start writing', x)
    return H(Promise.delay(2000, 'y').tap(() => console.log('finish writing', x)))
  })
  .done()

产生这样的输出:

read 0
start writing 0
finish writing 0
read 1
start writing 1

问题:我想要一个一定大小的缓冲区,我将在其中堆叠来自生产者的数据。因此,使用大小为 1 的缓冲区,输出应如下所示:

read 0
start writing 0
read 1
finish writing 0
start writing 1
read 2

所以,如果“生产者”“忙”,我想缓冲生产者的价值。高地可以做这样的事情吗?

4

2 回答 2

0

不,这是不可能的(不是通过承诺,但是是的 - 使用回调)并且他们确实在这个冗长的问题线程中声明了这一点

我决定编写scramjet的原因之一。

像你这样的简单案例:

let i = 0;
const stream = new (require("scramjet").DataStream)({read() { this.push(i++); })

stream.map(
    (x) => Promise.delay(2000, 'y').tap(() => console.log('finish writing', x))
).accumulate(
    () => 0
).then(
    () => console.log("done")
)

它只是按您的意愿工作。:)

于 2017-04-05T11:38:56.013 回答
0

答案在我的文章中

这里的想法 - 缓冲是流 api 的一部分。高地只是操纵溪流

于 2017-04-05T11:43:25.493 回答