首页 > 解决方案 > Promise 中的递归

问题描述

我正在编写一些可以执行一系列操作的软件。这些动作中的每一个基本上都是一个承诺。每个动作都可能有一个计时器触发器(当计时器耗尽时触发下一个动作)。此外,动作列表可能是可循环的。

现在有可能,一个动作列表例如由 2 个项目组成,每个项目在完成最后一个项目后 0 秒执行,并启用循环,从而实际上生成一个无限循环。

这在应用程序中没有错误,因此可以做到。我的代码目前看起来(非常简化)是这样的:

const actions = [...] // (() => Promise<void>)[]
const current = 0
const loop = true
const autoTrigger = true

const go() {
   if(current > actions.length && loop) current = 0
   current ++ 
   return Promise.resolve().then(() => {
      return actions[current - 1]()
   }).then(() => {
      if(autoTrigger) return go()
      return Promise.resolve()
   })
}

假设在迭代几十万次之前它可能不会被中止,或者它可能因为递归太深而导致错误,那么这段代码是否可以安全运行?

标签: javascriptrecursionpromise

解决方案


是的,运行是安全的。.then()因为在解释器返回空堆栈(即使它们立即解析)之前,promise 不会调用它们的处理程序,所以这种类型的递归式编码风格不会建立堆栈 - 无论多少次递归。

所以,这是安全的,不管它运行多少次迭代。它甚至可以无限期地运行而没有任何堆栈堆积。


推荐阅读