javascript - 使用 async/await 动态生成 promise 链

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

比如,我需要按顺序重复 AJAX 请求 N 次。

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

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 告终。我要顺序。

最佳答案

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

这里我只是包裹在一个函数 run 中,它甚至可以是一个 IIFE..

在大多数情况下,当你开始使用 async/await 时,无论如何你都会从另一个 async 函数调用,所以这个小的 run不需要 stub 。

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

关于javascript - 使用 async/await 动态生成 promise 链,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49275311/

相关文章:

javascript - 为什么 Babel 使用 `arguments` 对象作为可选参数?

javascript - NodeJS - 意外的标识符等待

c# - 如何在 'await' 引发 EventHandler 事件

c# - 在 Razor 页面中访问异步属性

javascript - Angular - 动态模块加载和编译

javascript - 在 JavaScript 中尝试使用 localStorage 保存和加载包含对象的数组时出错

javascript - 滚动后 jquery 动画的长时间延迟

javascript - 从模板发送到组件生命周期方法时数据损坏了吗?

javascript - NodeJs 中的级联 require,要求一个文件需要另一个文件 NodeJs

javascript - 导入的对象是不可写的吗?