js实现多个异步任务的串行和并行执行(add/sum)
2023-09-14 09:07:44 时间
// add 异步相加 function add(a, b) { return new Promise((resolve, reject) => { setTimeout(() => { resolve(a + b); }, 1000); }); } // 传入不定长度的数组,与 add 函数,对数组的每个值进行相加,串行相加 function sum(arr, add) { // 因为 add 函数返回的结果为 Promise,所以这里要给一个 Promise.resolve()的初始值,如果没有返回结果则给 0 // 这里的每个 p,c 都是 promise 返回结果 return arr.reduce((p, c) => { return p.then((acc) => { if (!acc) { acc = 0; } return add(acc, c); }); }, Promise.resolve()); } // console.log(await add(1, 2)); console.log( sum([1, 2, 3, 4, 5], add).then((res) => { console.log(res); // 15 }) ); // 使用 Promise.all 来实现读个任务并行执行,每个任务执行一部分,传入concurrency 代表将数组以几个分一组,剩余不够的成一组 function sumPoll(arr, add, concurrency = Infinity) { const chunks = []; // 得到分组之后的数组 const len = arr.length <= concurrency ? arr.length : concurrency; while (arr.length) { chunks.push(arr.splice(0, len)); } // console.log("chunks", chunks); // 分组之后每一组算一个异步任务开始执行,tasks 为异步任务列表 const tasks = []; for (const chunk of chunks) { // 每一个 task 中的数组单独进行计算 tasks.push( chunk.reduce( (p, c) => p.then((acc) => { if (!acc) acc = 0; // console.log("acc", acc); // console.log("c", c); return add(acc, c); }), Promise.resolve() ) ); } // 使用 Promise.all return Promise.all(tasks).then((result) => { console.log("result", result); // 得到返回的计算结果的数组 if (result.length === 1) { return result[0]; } // 将计算结果的数组再次传入sumPoll 进行计算 return sumPoll(result, add, concurrency); }); } sumPoll([1, 2, 3, 4, 5, 6, 7, 8, 9, , 10], add, 3).then((result) => console.log(result) );
参考代码:https://github.com/shfshanyue/Daily-Question/issues/662#issuecomment-885993395
关注我,好多内推机会。
相关文章
- 好好学习JS异步原理
- 【node.js】谈一下自己关于多系统共用账号的一点实践
- js实现多个异步任务的串行和并行执行(add/sum)
- JS跳转代码_js中跳转页面路径
- 用JS获取地址栏url参数的方法_js的url是啥
- js异步编程的三种模式
- JS实现函数重载
- 如何利用js生成二维码_前端生成二维码
- JS对象转数组_js怎么把数组转成对象
- 原生 JS 实现 HTML 转 Markdown ,html2md.js
- 原生 JS 实现 HTML 转 Markdown,以及其实现逻辑(html2md.js 或 html2markdown.js)
- js 异步请求后各种监听事件的处理,如异步请求后click 事件失效详解编程语言
- 使用浮动框架实现JS异步通信
- JS Date对象的创建和使用
- 使用 JS 操作 Redis:实现强大数据存储.(js调用redis)
- 数据JS技术实现实时获取Oracle数据(js实时获取oracle)
- Oracle中使用JS变量管理数据(oracle使用js变量)
- 用JS实现网页元素阴影效果的研究总结
- JS小功能(操作Table--动态添加删除表格及数据)实现代码
- js异步操作回调函数如何控制执行顺序
- js中同步与异步处理的方法和区别总结
- JS根据变量保存方法名并执行方法示例
- 采用call方式实现js继承
- asp.net+ajaxfileupload.js实现文件异步上传代码分享