JavaScript 中的递归异步函数

新手上路,请多包涵

我正在尝试在 JavaScript 中使用 async/await 编写递归函数。这是我的代码:

 async function recursion(value) {
  return new Promise((fulfil, reject) => {
    setTimeout(()=> {
      if(value == 1) {
        fulfil(1)
      } else {
        let rec_value = await recursion(value-1)
        fulfil(value + rec_value)
      }
    }, 1000)
    })
}

console.log(await recursion(3))

但是我有语法错误:

 let rec_value = await recursion(value-1)
                              ^^^^^^^^^

SyntaxError: Unexpected identifier

原文由 user2700246 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 530
2 个回答

我会按如下方式编写您的代码:

 const timeout = ms => new Promise(resolve => setTimeout(resolve, ms));

async function recursion(value) {
  if (value === 0) return 0;

  await timeout(1000);
  return value + await recursion(value - 1);
}

(async () => console.log(await recursion(3)))();

原文由 user663031 发布,翻译遵循 CC BY-SA 3.0 许可协议

您尚未将 setTimeout 处理程序声明为 async 因此编译器无法识别 await 关键字。从它的外观来看,您实际上并不需要在顶层使用它,因此您可以更新为:

 function recursion(value) {
    return new Promise((resolve, reject) => {
        setTimeout(async () => {
            // use await keyword
        });
    });
}

原文由 James 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题