javascript - 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()
})
}
假设在迭代几十万次之前它可能不会被中止,或者它可能因为递归太深而导致错误,那么这段代码是否可以安全运行?
解决方案
是的,运行是安全的。.then()
因为在解释器返回空堆栈(即使它们立即解析)之前,promise 不会调用它们的处理程序,所以这种类型的递归式编码风格不会建立堆栈 - 无论多少次递归。
所以,这是安全的,不管它运行多少次迭代。它甚至可以无限期地运行而没有任何堆栈堆积。
推荐阅读
- amazon-web-services - 如何使用 greengrass env 上传 aws lambda 函数?
- android - Android:使用 Glide - DataBinding 设置占位符图像
- vuejs2 - 如何在 Vuetify 中去抖 v-autocomplete 过滤器功能?
- python - python导入随机问题-AttributeError:'builtin_function_or_method'对象没有属性
- azure - 具有目录映射的 Azure Blob 存储
- html - Google 输入工具无法在 SSL 认证网站上运行
- python - 不能融合两种模式来服务于特定目的
- c# - 如何检查是否在 C# 中安装了 Microsoft Edge Chromium
- java - 如何使用 JHipster 和 Liquibase 更新现有数据库?
- swift - 无法获得空范围的随机值