NodeJS - 递归中的承诺链成本

时间:2016-11-13 08:25:25

标签: node.js

我正在尝试在我的javascript代码中实现几个状态处理程序函数,以便在每个状态中执行2个不同的不同操作。这类似于Java的状态设计模式(https://sourcemaking.com/design_patterns/state)。

从概念上讲,我的程序需要保持连接到elasticsearch实例(或任何其他服务器),然后解析并将一些传入数据POST到el。如果弹性搜索没有可用的连接,我的程序会在一些重试期间不断地连接到el。

简而言之,

  • 未连接时,请继续尝试连接
  • 连接后,开始发布数据

主运行循环以递归方式调用自身,

function run(ctx) {
  logger.info("run: running...");
  // initially starts with disconnected state...
  return ctx.curState.run(ctx)
    .then(function(result) {
      if (result) ctx.curState = connectedSt;
      // else it remains in old state.
      return run(ctx);
    });
}

这并不是一个真正的递归fn,因为每个调用都是在一个紧密循环中调用自身。但我怀疑它最终会在链中产生许多承诺,并且从长远来看它将消耗更多的内存,因此最终会挂起。

  1. 我的假设/理解是对的吗?或者写这种代码可以吗?
  2. 如果没有,我应该考虑调用setImmediate / process.nextTick等吗?
  3. 或者我应该考虑使用TCO(尾部成本优化),当然我还没有完全理解这个概念。

1 个答案:

答案 0 :(得分:3)

是的,通过返回一个新的promise(递归调用run()的结果),你可以有效地链接另一个promise。

setImmediate()process.nextTick()都不会直接解决这个问题。

当您再次致电run()时,根本不要return它,你应该没事。