JavaScript并发请求:如何依次获取所有请求结果?

JavaScript并发请求:如何依次获取所有请求结果?

本文探讨如何在javascript中,在限制并发请求数量的同时,依次获取每个请求的响应结果。 一个常见场景是限制并发请求数以避免服务器过载,同时需要对每个请求的返回结果进行单独处理。 下面分析一个不完美的例子,并提供改进方案。

JavaScript并发请求:如何依次获取所有请求结果?

问题代码及分析:

以下代码试图限制并发请求数,但结果不尽如人意:

const createpool = (task, { concurrency } = {}) => {  const pool = [];  let runningcount = 0;  return function (i) {    return new Promise((resolve, reject) => {      pool.push(() => task(i));      function run() {        while (pool.length && runningcount  {              resolve(val)            })            .catch((e) => reject(e))            .finally(() => {              runningcount--;              run();            });        }      }      run();    });  };};// 模拟业务调用const originfetchdata = (id) => {  return new Promise((resolve) => {    setTimeout(() => resolve(id), 2000);  });};const fetchdata = createpool(originfetchdata, { concurrency: 5 });for (let i = 0; i  {    console.log("response ---", response);  // 问题:只能获取前五个请求的结果  });}

登录后复制

该代码的问题在于for循环同步执行,创建了多个Promise,但createpool函数内部的resolve和reject只属于同一个Promise,后来的Promise共享了前几个Promise的resolve函数。

立即学习“Java免费学习笔记(深入)”;

改进方案:

为了解决这个问题,需要为每个请求创建独立的Promise,并将其与请求ID关联起来。可以使用Map对象来存储每个请求的Promise:

const createPool = (task, { concurrency } = {}) => {  let runningCount = 0;  const pool = [];  const promiseMap = new Map();  return function (i) {    return new Promise((resolve, reject) => {      promiseMap.set(i, { resolve, reject });      pool.push(() => task(i));      function run() {        while (pool.length && runningCount  {              const { resolve } = promiseMap.get(val);              resolve(val);            })            .catch((e) => reject(e))            .finally(() => {              runningCount--;              run();            });        }      }      run();    });  };};

登录后复制

修改后的createPool函数使用Map对象promiseMap存储每个请求对应的resolve和reject函数,确保每个请求都能正确获取自己的响应结果。 通过这种方式,我们成功地实现了在限制并发请求数量的同时,依次获取所有请求的响应结果。

以上就是JavaScript并发请求:如何依次获取所有请求结果?的详细内容,更多请关注【创想鸟】其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至253000106@qq.com举报,一经查实,本站将立刻删除。

发布者:PHP中文网,转转请注明出处:https://www.chuangxiangniao.com/p/3044686.html

(0)
上一篇 2025年3月13日 15:28:35
下一篇 2025年3月8日 00:50:56

AD推荐 黄金广告位招租... 更多推荐

相关推荐

  • JavaScript并发控制:如何确保异步请求的响应结果依次获取?

    JavaScript并发控制:有序获取异步请求结果 本文探讨javascript中如何控制并发请求数量,并按顺序获取每个请求的响应结果。 许多开发者在处理并发请求时,容易忽略异步任务结果的正确处理顺序。 一个常见的错误是:使用createP…

    2025年3月13日
    200
  • 高效异步操作:Guzzle Promises 库实战指南

    我们的项目需要从多个API获取数据,每个API请求都是独立的异步操作。最初,我使用的是简单的curl函数,每个请求都依次执行。这种串行方式在请求数量较多时,响应时间非常长,用户体验极差。 我尝试使用多线程,但代码变得复杂且难以维护,而且线程…

    2025年3月13日
    200
  • 反应式Java框架与传统编程范式的对比与优势

    反应式 java 框架,通过非阻塞 i/o 和异步编程,解决了传统范式在并发性、响应能力和弹性方面的挑战。这些框架提供:1)并发性和可扩展性:处理大量请求而不受线程限制;2)响应能力:快速对事件做出反应;3)弹性:处理和恢复错误;4)易于维…

    2025年3月13日
    200
  • Vue与服务器端通信的刨析:如何处理并发请求

    Vue与服务器端通信的探析:如何处理并发请求 引言:在开发前端应用程序时,与服务器进行通信是非常常见的需求。在使用Vue框架开发时,我们通常会使用axios或者fetch等工具库来发送HTTP请求。但是,在应对并发请求时,我们需要注意如何合…

    2025年3月13日
    200
  • nodejs有什么优势

    Node.js 作为服务器端 JavaScript 平台的优势包括:高性能:事件驱动、非阻塞 I/O 模型。跨平台:在多种操作系统上运行。庞大生态系统:提供了丰富的 npm 包。单线程模型:事件循环管理并发请求。易于学习:对于 JavaSc…

    2025年3月11日
    200
  • nodejs是java语言吗

    否,Node.js 并不是 Java 语言。它是一种基于 JavaScript 的运行时环境,用于编写服务器端应用程序。 Node.js 是 Java 语言吗? 否,Node.js 并不是 Java 语言。 详细解释: Node.js 是一…

    2025年3月11日
    200
  • nodejs和vue的关系

    Node.js 是一种服务器端 JavaScript 运行时,而 Vue.js 是一个用于构建用户界面的 JavaScript 框架。两者协同工作:Node.js 处理服务器端逻辑,如 HTTP 请求和数据访问。Vue.js 管理客户端逻辑…

    2025年3月11日
    200
  • nodejs到底是什么

    Node.js 是一种基于 V8 JavaScript 引擎的开源 JavaScript 运行时环境,允许开发人员编写服务器端应用程序。其特点包括跨平台、事件驱动、非阻塞和模块化。Node.js 为开发人员提供快速开发、高性能、可扩展性和多…

    2025年3月11日
    200
  • nodejs的特点包括什么

    Node.js 是一款流行的 JavaScript 运行时环境,因其异步、非阻塞、基于事件、跨平台、丰富的生态系统、轻量高效、可扩展和易于使用等特点而闻名。 Node.js 的特点 Node.js 是一种流行的 JavaScript 运行时…

    2025年3月11日
    200
  • nodejs和golang哪个性能好

    性能对比:Node.js以高吞吐量和低延迟见长,而Go更适合处理复杂计算和可扩展性需求。 Node.js 与 Go:性能比较 在选择后端编程语言时,性能是一个关键考虑因素。Node.js 和 Go 都是流行的高性能语言,但它们具有不同的特性…

    2025年3月11日
    200

发表回复

登录后才能评论