
并发控制中逐个获取请求结果
在控制并发数的场景中,需要依次得到每个任务执行后的请求结果。本文将解决如何解决这个问题。
创建的并发控制池控制着并发数,但是需要修改代码逻辑以在循环中获取每个请求的结果。
问题根源
100 次循环同步执行,初始产生了 100 个并发任务。由于并发数控制为 5,只有前 5 个任务会被处理。其他 95 个任务的 promise 被丢弃,导致无法得到这些任务的结果。
解决方案
可以使用一个 map 来缓存每个 promise 的 resolve 和 reject 函数,确保所有任务的请求结果都可以被获取。
修改后的代码
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(); }); };};
在修改后的代码中,promise 的 resolve 和 reject 函数在 map 中进行缓存。当任务执行完成后,可以从 map 中获取相应的函数并将其调用,从而得到请求结果。
使用该并发控制池,可以通过监听 promise 来逐个获取每个请求的结果,从而解决最初的问题。
以上就是并发控制中如何获取所有任务的请求结果?的详细内容,更多请关注创想鸟其它相关文章!
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/1497640.html
微信扫一扫
支付宝扫一扫