javascript - 如何构建用于计数的递归流

标签 javascript node.js bacon.js

我想构建一个自定义流,递归计算页面:

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/

相关文章:

javascript - 如何仅向环回 API socket.io 中连接的套接字(客户端)发送数据

node.js - Nestjs:验证函数不适用于 jwt

node.js - 与 GraphQL 数据加载器一起实现内存缓存

javascript - 使用 Bacon.js 切换按钮

javascript - 尝试使用reduce在Javascript中添加路由父URL

javascript - reactjs 如何过滤/检查数组中的任何对象是否存在于另一个对象数组中?

javascript - 如何以 HTML 形式上传多个文件?

rxjs - 在满足条件之前忽略流中的事件?

javascript - FRP with Bacon.js - 如何为暂停按钮建模?

javascript - Bluebird 忘记返回警告丢失