我正在尝试在我的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,因为每个调用都是在一个紧密循环中调用自身。但我怀疑它最终会在链中产生许多承诺,并且从长远来看它将消耗更多的内存,因此最终会挂起。
答案 0 :(得分:3)
是的,通过返回一个新的promise(递归调用run()
的结果),你可以有效地链接另一个promise。
setImmediate()
和process.nextTick()
都不会直接解决这个问题。
当您再次致电run()
时,根本不要return
它,你应该没事。