我想构建一个自定义流,递归计算页面:
var pageStream = function(page, limit) {
return Bacon.fromBinder(function(sink) {p
if (page >= limit) {
sink(new Bacon.End());
} else {
sink(Bacon.fromArray([page]));
sink(new Bacon.Next(function() {
return pageStream(page + 1, limit);
}));
}
}).flatMapConcat(function(v) { return v; });
};
stream = pageStream(1, 5);
// If I use this code nothing is logged, why?
// stream.onEnd(function(v) {
// console.log('done');
// });
stream.log();
我要pageStream
计数到 limit
并结束流。它可以计数到极限,但不会发送最终的 end
事件。
如果我听 stream.onEnd
,该流根本不起作用。
最佳答案
此任务不需要递归,但如果您只想要一些递归示例,请看这里:
var pageStream = function(page, limit) {
if (page > limit) {
return Bacon.never();
} else {
return Bacon.once(page).concat(pageStream(page + 1, limit));
}
}
但我不会推荐此解决方案,例如它生成的 pageStream(1, 5)
:
Bacon.once(1).concat(
Bacon.once(2).concat(
Bacon.once(3).concat(
Bacon.once(4).concat(
Bacon.once(5).concat(
Bacon.never())))));
这在大量数据上表现不佳。
相反,我会做这样的事情:
var pageStream = function(page, limit) {
var arr = [];
while (page <= limit) {
arr.push(page);
page++;
}
return Bacon.fromArray(arr);
}
<小时/>
Also if I listen to stream.onEnd, the stream doesn't work at all.
这是典型的 Bacon 陷阱,涉及 .fromArray
或 .once
等同步流:https://github.com/baconjs/bacon.js/wiki/FAQ#why-isnt-my-subscriber-called
为了避免这种情况,您可以使用 .sequentially()
代替 .fromArray()
,并使用 .later()
代替 .once()
:
var pageStream = function(page, limit) {
var arr = [];
while (page <= limit) {
arr.push(page);
page++;
}
return Bacon.sequentially(0, arr);
}
var pageStream = function(page, limit) {
if (page > limit) {
return Bacon.never();
} else {
return Bacon.later(0, page).concat(pageStream(page + 1, limit));
}
}
关于javascript - 如何构建用于计数的递归流,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27743312/