本文探讨如何在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号