【问题标题】:Dynamically generate a chain of promises with async/await使用 async/await 动态生成一系列 Promise
【发布时间】:2018-08-22 20:08:14
【问题描述】:

比如说,我需要按顺序重复一个 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))

我所有的尝试最终都并行运行了 Promise。我想要顺序。

【问题讨论】:

  • for(let i=0;i

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


【解决方案1】:

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

【讨论】:

  • 所以我的错误是使用了forEachmap 之类的方法。
  • @lolmaus-AndreyMikhaylov 是的,不幸的是 forEach / map 等还没有async 知道,。在他们实现的下一个 JS 版本中表现得很好,.. 但是现在 bluebird 的 Promise 有一个不错的 map 函数,它带有一个不错的选项 concurrency..
  • 我猜一个自定义的异步感知 forEach 等效项会在后台使用您的答案?
猜你喜欢
  • 2018-01-14
  • 2016-03-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-10-10
  • 2021-05-13
相关资源
最近更新 更多