const mainTasks = ['mainTask1', 'mainTask2', 'mainTask3', 'mainTask4']
const subTasks = ['subTask1', 'subTask2', 'subTask3']
const defaultTimeout = 1000
// SubTasks should be run as async
// Tasks should be run as sync
const subTaskHandler = () => {
return new Promise(resolve => {
setTimeout(() => {
resolve();
}, defaultTimeout * 2);
})
}
const main = async () => {
await Promise.all(
mainTasks.map((mainTask, index) => {
return new Promise(resolve => {
setTimeout(async () => {
for (subTask of subTasks) {
await subTaskHandler(defaultTimeout)
console.log(`${mainTask} -> ${subTask}: Completed`)
}
resolve()
}, defaultTimeout + index * 1000)
})
})
)
console.log('done')
}
main()
I'm going to execute mainTasks as sync and subTasks as async At the end, I try catch the point when the mainTasks are all finished as well subTasks. Seems I got the point But I met the unexpected result.
mainTask1 -> subTask1: Completed
mainTask2 -> subTask1: Completed
mainTask3 -> subTask2: Completed
mainTask1 -> subTask2: Completed
mainTask4 -> subTask3: Completed
mainTask2 -> subTask2: Completed
mainTask3 -> subTask3: Completed
mainTask1 -> subTask3: Completed
mainTask4 -> subTask3: Completed
mainTask2 -> subTask3: Completed
mainTask3 -> subTask3: Completed
mainTask4 -> subTask3: Completed
done
Where is mainTask4 -> subTask1 and 2??