node.js - async/await 中的递归未在主函数中解析

标签 node.js async-await es6-promise

我正在尝试在 async/await 函数中使用递归。问题是我无法在主函数中获得最终的 promise ,在该函数中我最初调用了递归方法

async function delay(ms) {
  return await new Promise(resolve => setTimeout(resolve, ms))
}

async function recursion(i) {
  return new Promise(async (resolve, reject) => {
    if (i == 0) {
      console.log(`i == 0`)
      resolve(i)
    } else {
      console.log(`i = ${i}. Wait 1 second...`)
      i--

      await delay(2000)
      await recursion(i)
    }
  })
}

async function main() {
  let i = await recursion(3)
  console.log(`END OF RECURSION`) //This code never use!
  console.log(`i => ${i}`)
}
main()

控制台日志:

i = 3. Wait 1 second...
i = 2. Wait 1 second...
i = 1. Wait 1 second...
i == 0

最佳答案

这是 promise 构造反模式。已经存在现有的链式 promise ,无需创建新的 promise 。从 Promise 回调返回的 promise 将被忽略,这会破坏 promise 链。此外,还存在不一致的情况,该值并不总是从递归返回。

应该是:

async function recursion(i) {
    if (i == 0) {
      console.log(`i == 0`)
      return i
    } else {
      console.log(`i = ${i}. Wait 1 second...`)
      i--

      await delay(2000)
      return recursion(i)
    }
}

关于node.js - async/await 中的递归未在主函数中解析,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55758816/

相关文章:

javascript - 如何将 Typescript 与原生 ES6 Promises 结合使用

javascript - 等待单个 promise 与异步迭代器的异步解析顺序

javascript - 访问导出的模块

node.js - Passport.authenticate 导出 -> Passport.authenticate( 一些东西 ) (req, res, next)?

javascript - 尝试循环 axios 请求并异步推送

java - 如何正确使用 wait 和 notify 方法?

javascript - 在 JavaScript 中扁平化 promise

javascript - readline 不暂停或允许输入

javascript - 带有 Mongoose OOP 的 Node.JS - 如何将 Mongoose 数据访问代码与纯数据对象分开?

c# - 在 WPF 应用程序中正确实现任务