Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/amazon-s3/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Node.js 异步/等待中的递归未在主函数中解析_Node.js_Async Await_Es6 Promise - Fatal编程技术网

Node.js 异步/等待中的递归未在主函数中解析

Node.js 异步/等待中的递归未在主函数中解析,node.js,async-await,es6-promise,Node.js,Async Await,Es6 Promise,我试图在asynС/await函数中使用递归。问题是我无法在主函数中得到最终承诺,在主函数中我最初调用递归方法 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)

我试图在asynС/await函数中使用递归。问题是我无法在主函数中得到最终承诺,在主函数中我最初调用递归方法

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()
console.log:

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

这是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)
    }
}