
JavaScript并发控制与异步结果完整获取
本文探讨如何在JavaScript并发程序中,确保所有异步请求的结果都能被正确获取。 许多开发者在使用并发控制时,会遇到for循环只能获取部分异步结果的问题,这是因为异步操作的特性与循环执行顺序不匹配。
原始代码通常使用一个createPool函数实现并发限制,但其内部的Promise resolve和reject函数在循环中被重复利用。 当循环快速执行完毕后,大量异步任务等待执行,但它们共享相同的resolve和reject,导致只有少数异步任务的结果能被捕获。
改进后的方法的核心在于使用Map对象promiseMap来分别存储每个任务对应的Promise的resolve和reject函数。 promiseMap以任务ID作为键,存储对应的resolve/reject函数,确保每个异步任务都能找到其专属的resolve函数来返回结果。
立即学习“Java免费学习笔记(深入)”;
以下是改进后的createPool函数:
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 < concurrency) {
const task = pool.shift();
runningCount++;
task()
.then((val) => {
const { resolve } = promiseMap.get(val);
resolve(val);
})
.catch((e) => reject(e))
.finally(() => {
runningCount--;
run();
});
}
}
run();
});
};
};通过promiseMap,每个异步任务都能正确地将结果传递给对应的resolve函数,从而在循环中完整获取所有任务的结果,解决了原始代码中只能获取部分结果的问题。
以上就是JavaScript并发编程:如何正确获取所有异步请求的结果?的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号