使用 async/await 动态生成承诺链

Dynamically generate a chain of promises with async/await

说,我需要按顺序重复一个 AJAX 请求 N 次。

通常(即没有 async/await),我会使用 reduce 来链接承诺:

function timeout (ms = 1000) {
  return new Promise(resolve => setTimeout(resolve, ms))
}

function request (message, ms = 1000) {
  return timeout(ms).then(() => console.log(message))
}

function makeArray (i) {
  return new Array(i).fill(null);
}

makeArray(5).reduce(
  (promise, _, i) => promise.then(() => request(i)),
  Promise.resolve()
)

如何用 async/await 重写此代码?

我想await request(i)而不是promise.then(() => request(i))

我所有的尝试都以 运行 并行结束。我要顺序。

记住 await 只能从 async 函数调用。

这里我只是封装了一个函数 run,它甚至可以是一个 IIFE..

在大多数情况下,当您开始使用 async / await 时,您会从另一个 async 函数调用,因此不需要这个 run 存根。

function timeout (ms = 1000) {
  return new Promise(resolve => setTimeout(resolve, ms))
}

function request (message, ms = 1000) {
  return timeout(ms).then(() => console.log(message))
}

async function run() {
  for (let trys = 0; trys < 5; trys ++) {
    await request(trys);
  }
}

run();