所以,我有一个代码来模拟这个问题:
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
所以,如果“生产者”“忙”,我想缓冲生产者的价值。是否可以用高地做这样的事情?
答案 0 :(得分:0)
没有。这是不可能的(不是通过承诺,不是肯定 - 使用回调)并且他们确实在this longish issue thread中说明了
我决定写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")
)
它只是按你的意愿工作。 :)
答案 1 :(得分:0)
答案在my arcticle
这里的想法 - 缓冲是流api的一部分。高地只是操纵溪流