TypeScript Promise 系列执行

TypeScript Promise Series Execution

我有一个文档对象列表,需要对列表中的每个文档 ID 进行 API 调用,并希望以一系列方式执行 API 调用。 Promise.all 和 Promise.allSelected 在 Typescript 中以并发方式执行它们

[
  {
    "doc_id": 11
  },
  {
    "doc_id": 22
  },
  {
    "doc_id": 33
  }
]

提前致谢

遍历您的数组,此处:documents 类型 Array<{ doc_id: number }>,以按给定顺序执行它们:

for (const document of documents) {

  const response = await callApi(document['doc_id']);

  // do someting with response
  // or call just await callApi(document['doc_id']);

}

Promise.all 和 Promise.allSettled 将异步并同时等待承诺,但是 大多数 API 调用在承诺创建的那一刻开始.因此,一次创建所有 promise 然后简单地 await 一个一个地创建它们而不是使用 Promise.all 并不能解决你的问题:你需要推迟它们的创建一个一个地发生。

如果您想延迟对第二个文档的 API 调用,您需要确保在为第二个响应创建 Promise 之前 await 第一个响应。 ( 做得很好。)如果您使用 thencatch 而不是 await,您需要确保第二次调用 API 发生在第一个调用的 then 处理程序中,第三个发生在第二个调用的处理程序中,依此类推。

也有处理一般的工具,可以保证一次只有n个未结算的promises共存;按顺序执行 API 调用只是 n = 1 的情况。你可能更喜欢在这里使用一个相当通用的节流库,因为你可能会发现在未来一次处理一个小的有限数字(n = 3)或按时间节流(例如每秒 1 个请求)。如果您将代码重写为 运行 串行,这将很难实现,但很容易使用库进行修改。