web-dev-qa-db-ja.com

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
8
user2700246

次のようにコードを記述します。

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

setTimeoutハンドラーをasyncとして宣言していないため、コンパイラーはawaitキーワードを認識しません。その外観からは、実際には最上位レベルでは必要ないため、次のように更新できます。

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