JavaScript中的递归异步函数

Posted

技术标签:

【中文标题】JavaScript中的递归异步函数【英文标题】:Recursive async function in JavaScript 【发布时间】: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

【问题讨论】:

可能重复? ***.com/questions/33289726/… 【参考方案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
        );
    );

【讨论】:

以上是关于JavaScript中的递归异步函数的主要内容,如果未能解决你的问题,请参考以下文章

如何在V8中优化JavaScript异步编程?

JavaScript 用异步递归显示Justin Bieber推文

JavaScript 中的递归函数

Javascript 中的回调函数和递归函数简单实际分析学习

翻译JavaScript 中的函数式编程:函数组合与柯里化

如何使用 JavaScriptCore 从 Swift 中的 javascript SDK 调用异步 javascript 函数