JavaScript 中的递归异步函数

19

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

可能是重复问题?https://dev59.com/RFwX5IYBdhLWcg3w2iou - Kevin B
3个回答

16

我会这样编写你的代码:

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)))();


2
这是一种更好的编写代码的方式,但它并不像@James的回答那样回答问题。 - Jake

8

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

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

1

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接