运行 并行的主要任务和子任务 sequential/dependent
Run Main Tasks parallel and Sub Tasks sequential/dependent
所以我有一个用例,其中有 5 个主要任务,在主要任务中有 3 个子任务(比如异步 I/O 操作)。主任务是独立的,而单个主任务中的子任务是相互依赖的。我可以 运行 所有任务按顺序进行,但这会浪费 CPU 时间。
我需要一种方法来使用 async-await 和 Promise 运行 所有主要任务并行并在每个主要任务中 运行 子异步任务顺序。
我使用 vanilla JavaScript async
await
和 Promise
的解决方案
async function myFunc() {
const list = ["MainA:", "MainB:", "MainC:", "MainD:", "MainE:"];
let allPromises = [];
list.forEach(main => {
allPromises.push(runSubTasks(main));
});
console.log("allPromises before settle:", allPromises);
let data = await Promise.all(allPromises);
console.log("allPromises after settle:", allPromises);
console.log("resolved values inside allPromises:", data);
// All main tasks are done by this point
}
myFunc();
async function runSubTasks(main) {
const one = await asyncSubTask1(main, "");
const two = await asyncSubTask2(main, one);
return asyncSubTask3(main, two);
// or
// const three = await runTask3(main, two);
// return three;
}
function asyncSubTask1(main, sub) {
return new Promise((res, rej) => {
setTimeout(() => {
console.log(`${main}${sub}1`);
res(`${sub}1`);
}, Math.random() * 10000);
});
}
function asyncSubTask2(main, sub) {
return new Promise((res, rej) => {
setTimeout(() => {
console.log(`${main}${sub}2`);
res(`${sub}2`);
}, Math.random() * 10000);
});
}
function asyncSubTask3(main, sub) {
return new Promise((res, rej) => {
setTimeout(() => {
console.log(`${main}${sub}3`);
res(`${main}${sub}3`);
}, Math.random() * 10000);
});
}
所以我有一个用例,其中有 5 个主要任务,在主要任务中有 3 个子任务(比如异步 I/O 操作)。主任务是独立的,而单个主任务中的子任务是相互依赖的。我可以 运行 所有任务按顺序进行,但这会浪费 CPU 时间。 我需要一种方法来使用 async-await 和 Promise 运行 所有主要任务并行并在每个主要任务中 运行 子异步任务顺序。
我使用 vanilla JavaScript async
await
和 Promise
async function myFunc() {
const list = ["MainA:", "MainB:", "MainC:", "MainD:", "MainE:"];
let allPromises = [];
list.forEach(main => {
allPromises.push(runSubTasks(main));
});
console.log("allPromises before settle:", allPromises);
let data = await Promise.all(allPromises);
console.log("allPromises after settle:", allPromises);
console.log("resolved values inside allPromises:", data);
// All main tasks are done by this point
}
myFunc();
async function runSubTasks(main) {
const one = await asyncSubTask1(main, "");
const two = await asyncSubTask2(main, one);
return asyncSubTask3(main, two);
// or
// const three = await runTask3(main, two);
// return three;
}
function asyncSubTask1(main, sub) {
return new Promise((res, rej) => {
setTimeout(() => {
console.log(`${main}${sub}1`);
res(`${sub}1`);
}, Math.random() * 10000);
});
}
function asyncSubTask2(main, sub) {
return new Promise((res, rej) => {
setTimeout(() => {
console.log(`${main}${sub}2`);
res(`${sub}2`);
}, Math.random() * 10000);
});
}
function asyncSubTask3(main, sub) {
return new Promise((res, rej) => {
setTimeout(() => {
console.log(`${main}${sub}3`);
res(`${main}${sub}3`);
}, Math.random() * 10000);
});
}