【问题标题】:Creating a queue of asynchronous function创建异步函数队列
【发布时间】:2021-01-27 21:01:07
【问题描述】:

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

async function queueRequest(): Promise<string> {
  await ... // some code to make sure all previous requests have already been completed
  const result = await makeRequest();
  return result;
}

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

提前致谢

【问题讨论】:

    标签: javascript typescript promise async-await es6-promise


    【解决方案1】:

    为此,您需要使用一个数组来转移任务并推送新的传入任务。

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

    这里是一个例子:

    
    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)
    }
    
    

    【讨论】:

      【解决方案2】:

      这个 sn-p 来自MDN page on Promises。他们在我下面的示例之后还有更多示例,以便对其进行一些扩展。

      使用一些巧妙的 JavaScript 可以实现顺序组合:

      [func1, func2, func3].reduce((p, f) => p.then(f), Promise.resolve())
      .then(result3 => { /* use result3 */ });
      

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

      Here 是一篇关于使用reduce() 实现顺序 Promise 目标的好文章。与 MDN 文档相比,它在遍历和解释每个步骤方面做得很好。

      【讨论】:

      • 我该如何解决这个问题,让每个queueRequest() 调用最终都会返回结果,并且我可以在任何时间点对新请求进行排队?
      猜你喜欢
      • 1970-01-01
      • 2019-02-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-12-11
      • 1970-01-01
      • 2012-11-01
      • 1970-01-01
      相关资源
      最近更新 更多