当前位置: 首页 > 知识库问答 >
问题:

有限制的promise。all()?

叶琦
2023-03-14

是否有一种方法/pattern来实现let res=promise.all([...p],limit)

  • promise-数组包含构造和返回promise
  • 的函数
  • res应在所有p
  • 解析后解析
  • 只有限制=3promise应并行运行
  • 第n+1个promise应在n个完成后立即开始。以便始终有limit解析器并行运行。

共有1个答案

戴建义
2023-03-14

我想出了创建n=limit链的想法,这些链并行运行,只要有promise就追加:

let promises = [];
for(let i=0; i<11; i++) promises[i] = () => {
  console.log('Construct:',i);
  return new Promise(resolve => {
    setTimeout(function() {
      console.log('Resolve:',i);
      resolve(i);
    }, Math.round(Math.random() * (2000 - 500) + 2000));
  });
}


function parallelLimit(promiseFactories, limit) {
  let result = [];
  let cnt = 0;

  function chain(promiseFactories) {
    if(!promiseFactories.length) return;
    let i = cnt++; // preserve order in result
    return promiseFactories.shift()().then((res) => {
      result[i] = res; // save result
      return chain(promiseFactories); // append next promise
    });
  }

  let arrChains = [];
  while(limit-- > 0 && promiseFactories.length > 0) {
    // create `limit` chains which run in parallel
    arrChains.push(chain(promiseFactories));
  }

  // return when all arrChains are finished
  return Promise.all(arrChains).then(() => result);
}


parallelLimit(promises, 4).then(console.log);
 类似资料:
  • Promise的限制 本节中我们将要讨论的许多细节已经在这一章中被提及了,但我们将明确地复习这些限制。 顺序的错误处理 我们在本章前面的部分详细讲解了Promise风格的错误处理。Promise的设计方式——特别是他们如何链接——所产生的限制,创建了一个非常容易掉进去的陷阱,Promise链中的错误会被意外地无声地忽略掉。 但关于Promise的错误还有一些其他事情要考虑。因为Promise链只不

  • 可能有助于为这个问题提供一点背景上下文:我正在构建一个角服务,它有助于将多部分表单数据(mp4视频)块上传到云中的存储服务。 我试图限制同时发生的未解决promise(chunk data请求)的数量。我使用的是侦听正在解析的所有区块上载promise,然后在发生这种情况时返回异步调用(以完成文件)。我认为我的算法遇到了竞争条件,因为在为具有大量块的文件安排所有作业之前被调用,但在较小的文件中成功

  • 有没有办法限制节点js中一次执行的并发Qpromise的数量? 我正在构建一个web scraper,它必须请求并解析3000多个页面,并且在没有限制的情况下,我提出的一些请求没有及时响应,因此连接停止,所需的响应(html代码)变得不可用。 为了解决这个问题,我发现限制请求的数量可以解决我的问题。 我曾尝试过以下方法,但均无效: Qpromise中的并发限制-节点 我需要请求一个URL数组,一次

  • 我使用ES6承诺来管理我的所有网络数据检索,有些情况下我需要强制取消它们。 基本上,这个场景是这样的,我在UI上有一个预先输入的搜索,其中请求被委托给后端,必须根据部分输入执行搜索。虽然这个网络请求(#1)可能需要一点时间,但用户继续键入,最终触发另一个后端调用(#2) 在这里,#2自然优先于#1,所以我想取消承诺包装请求#1。我在数据层中已经有了一个所有承诺的缓存,所以理论上我可以在尝试提交#2

  • 我正在寻找一个promise函数包装,它可以在给定的promise运行时限制/节流,以便在给定的时间只运行该promise的一组数量。 在以下情况下,不应同时运行,它们应按照先到先得的顺序一次运行一个。 关于如何设置这样的队列有什么想法吗? 我有一个来自奇妙的的“去盎司”功能。我需要修改它,以限制基于自身执行的promise,而不是延迟。

  • 问题内容: 我有表-s在许多一对多的关系与-s 目标是通过单个查询列出球员及其“前三项技能”。 小提琴 查询: 正如您在小提琴中看到的那样,查询结果仅缺少3个技能的限制。 我尝试了子查询的几种变体..联接等等,但是没有任何效果。 问题答案: 一种比较古怪的方法是对结果进行后处理: 当然,这是假设您的技能名称不包含逗号,并且数量很少。 小提琴 一个功能请求用于支持一个明确的条款是可惜还是没有得到解决