js实现多个异步任务的串行和并行执行(add/sum)
2023-06-13 09:11:33 时间
// 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异步原理
- 使用 Dapr JS SDK 让 Nest.js 集成 Dapr(微软开源的分布式应用程序运行时)
- 【说站】js中__proto__和prototype的关系
- 【说站】js中异步是什么意思
- 一道80%的前端开发都答不上来的js异步面试题
- js跨域请求的三种方法_jQuery
- js 数组去除重复数据-5 个提升你 JS 编码水平的实例
- JS代码之还原
- JS异步加载的三种方式
- JS 的 9 种作用域,你能说出几种?
- 原生 JS 实现 HTML 转 Markdown,以及其实现逻辑(html2md.js 或 html2markdown.js)
- js解析顺序了解一下详解编程语言
- JS技术连接Oracle数据库实现数据交互(js连接oracle实例)
- 妙用JS获取Oracle信息的快速方法(js获取Oracle)
- 使用JS在网页中连接Oracle数据库(js网页链接oracle)
- JS控制CSS样式的方法
- js延迟加载改变JS的位置加快网页加载速度
- js内存泄露的几种情况详细探讨
- 纯文字版返回顶端的js代码
- Js使用WScript.Shell对象执行.bat文件和cmd命令
- js实现键盘控制DIV移动的方法