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