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中的递归异步函数的主要内容,如果未能解决你的问题,请参考以下文章
JavaScript 用异步递归显示Justin Bieber推文
Javascript 中的回调函数和递归函数简单实际分析学习
如何使用 JavaScriptCore 从 Swift 中的 javascript SDK 调用异步 javascript 函数