本文探讨如何在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并发请求:如何依次获取所有请求结果?的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号