使用async / await动态生成promise链

时间:2018-03-14 10:29:38

标签: javascript ecmascript-6 async-await es6-promise ecmascript-2017

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

通常(即没有异步/等待),我会使用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重写此代码?

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

我所有的尝试最终并行地运行了承诺。我想顺序。

1 个答案:

答案 0 :(得分:3)

请记住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();
&#13;
&#13;
&#13;