【问题标题】:Recursive async function in JavaScriptJavaScript中的递归异步函数
【发布时间】:2018-02-24 19:47:48
【问题描述】:

我正在尝试在 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

【问题讨论】:

标签: javascript node.js asynchronous recursion async-await


【解决方案1】:

let rec_value = await recursion(value-1)

您只能在异步函数中等待,因此 JS 引擎无法解析代码。

改为将用法修改为以下,因为异步函数总是返回一个 Promise。

recursion(value-1).then((value) => { console.log(value)})

请参阅此处的详细文档 https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/async_function

【讨论】:

    【解决方案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)))();

    【讨论】:

    • 这是一种更好的代码编写方式,但它不能像@James answer那样回答问题。
    【解决方案3】:

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

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

    【讨论】:

      猜你喜欢
      • 2023-03-11
      • 1970-01-01
      • 2018-10-11
      • 2019-02-20
      • 2016-09-21
      • 1970-01-01
      • 2021-12-12
      • 2017-06-27
      • 2015-08-12
      相关资源
      最近更新 更多