How to use promise.all()
Syntax
Promise.all([Promise1, Promise2, Promise3])
.then((result) => {
console.log(result);
})
.catch((error) => console.log(`Error in promises ${error}`));
// OR
await Promise.all([Promise1, Promise2, Promise3]);
Init an async task
// a sample async function
const doTask = async (task) =>
new Promise((resolve) =>
setTimeout(() => {
console.log(new Date().toLocaleTimeString() + " - Do task: ", task);
resolve(true);
}, 500)
);
// a list
const loop = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10];
Some NG code
// a Bad way
console.time("Time way 1");
console.log(new Date().toLocaleTimeString() + " Start");
for (let i = 0; i < loop.length; i++) {
await doTask(i); // problem HERE: await in a loop
}
console.timeEnd("Time way 1");
// Output - sequentially - synchronous
1:05:59 PM Start way 1
1:05:59 PM - Do task: 0
1:06:00 PM - Do task: 1
1:06:00 PM - Do task: 2
1:06:01 PM - Do task: 3
1:06:01 PM - Do task: 4
1:06:02 PM - Do task: 5
1:06:02 PM - Do task: 6
1:06:03 PM - Do task: 7
1:06:03 PM - Do task: 8
1:06:04 PM - Do task: 9
Time way 1: 5009.138916015625 ms
// another Bad way
console.time("Time way 2");
console.log(new Date().toLocaleTimeString() + " Start");
const listPromises = [];
for (let i = 0; i < loop.length; i++) {
listPromises.push(await doTask(i)); // problem HERE: await in a loop, promise.all dose not work HERE, just push to list
}
await Promise.all(listPromises); // DOES NOT work right, all tasks done
console.timeEnd("Time way 2");
// Output - sequentially - synchronous
1:06:04 PM Start way 2
1:06:04 PM - Do task: 0
1:06:05 PM - Do task: 1
1:06:05 PM - Do task: 2
1:06:06 PM - Do task: 3
1:06:06 PM - Do task: 4
1:06:07 PM - Do task: 5
1:06:07 PM - Do task: 6
1:06:08 PM - Do task: 7
1:06:08 PM - Do task: 8
1:06:09 PM - Do task: 9
Time way 2: 5012.115966796875 ms
Good code
// a Good way
console.time("Time way 3");
console.log(new Date().toLocaleTimeString() + " Start way 3");
const listPromises = [];
for (let i = 0; i < loop.length; i++) {
listPromises.push(doTask(i)); // the tasks start running
}
await Promise.all(listPromises); // wait all tasks done
console.timeEnd("Time way 3");
// Output - asynchronous
1:06:09 PM Start way 3
1:06:09 PM - Do task: 0
1:06:09 PM - Do task: 1
1:06:09 PM - Do task: 2
1:06:09 PM - Do task: 3
1:06:09 PM - Do task: 4
1:06:09 PM - Do task: 5
1:06:09 PM - Do task: 6
1:06:09 PM - Do task: 7
1:06:09 PM - Do task: 8
1:06:09 PM - Do task: 9
Time way 3: 502.583984375 ms
// a Good way
console.time("Time way 4");
console.log(new Date().toLocaleTimeString() + " Start");
// the BEST WAY for readable
await Promise.all(
loop.map(async (item) => {
return await doTask(item);
})
);
console.timeEnd("Time way 4");
// Output - asynchronous
1:06:09 PM Start
1:06:10 PM - Do task: 1
1:06:10 PM - Do task: 2
1:06:10 PM - Do task: 3
1:06:10 PM - Do task: 4
1:06:10 PM - Do task: 5
1:06:10 PM - Do task: 6
1:06:10 PM - Do task: 7
1:06:10 PM - Do task: 8
1:06:10 PM - Do task: 9
1:06:10 PM - Do task: 10
Time way 4: 501.93310546875 ms