首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >创建异步函数队列

创建异步函数队列
EN

Stack Overflow用户
提问于 2020-10-13 21:56:52
回答 2查看 243关注 0票数 1

我有一个异步函数,它发出一个请求,makeRequest(): Promise<string>。基本上,我希望对此函数的调用进行排队,以便一次只发出一个请求。

代码语言:javascript
运行
复制
async function queueRequest(): Promise<string> {
  await ... // some code to make sure all previous requests have already been completed
  const result = await makeRequest();
  return result;
}

实现这样的目标最好的方法是什么?

提前感谢

EN

回答 2

Stack Overflow用户

发布于 2020-10-13 22:39:35

要做到这一点,您需要使用一个数组,在该数组中,您移动一个任务并推送新的传入任务。

我将使用fastq来避免重新实现管理队列数据结构的所有逻辑。

下面是一个示例:

代码语言:javascript
运行
复制
const queue = require('fastq')(worker, 1)

function worker (params, cb) {
  console.log('Executing ', params)
  setTimeout(() => {
    cb(null, { i: params })
  }, Math.random() * 100)
}

function makeRequest (params) {
  return new Promise((resolve, reject) => {
    queue.push(params, function (err, result) {
      if (err) { return reject(err) }
      resolve(result)
    })
  })
}

async function queueRequest (index) {
  const result = await makeRequest(index)
  // manage the result
  return result
}

for (let i = 0; i < 10; i++) {
  queueRequest(i)
}
票数 1
EN

Stack Overflow用户

发布于 2020-10-13 22:55:15

这段代码来自MDN page on Promises。他们有更多的例子,紧跟我下面的例子,以便在此基础上进行一点扩展。

使用一些聪明的JavaScript可以实现

顺序组合:

代码语言:javascript
运行
复制
[func1, func2, func3].reduce((p, f) => p.then(f), Promise.resolve())
.then(result3 => { /* use result3 */ });

基本上,我们将一个异步函数数组缩减为一个promise链,相当于: Promise.resolve().then(func1).then(func2).then(func3);:

Here是一篇很好的文章,它介绍了如何使用reduce()来实现连续承诺的目标。与MDN文档相比,它在浏览和解释每个步骤方面做得很好。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64336639

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档