TL; DR
Gunakan Promise.all
untuk panggilan fungsi paralel, perilaku jawaban tidak benar ketika kesalahan terjadi.
Pertama, jalankan semua panggilan asinkron sekaligus dan dapatkan semua Promise
objek. Kedua, gunakan await
pada Promise
objek. Dengan cara ini, selagi Anda menunggu yang pertama Promise
untuk menyelesaikan panggilan asinkron lainnya masih berlangsung. Secara keseluruhan, Anda hanya akan menunggu selama panggilan asinkron paling lambat. Sebagai contoh:
// Begin first call and store promise without waiting
const someResult = someCall();
// Begin second call and store promise without waiting
const anotherResult = anotherCall();
// Now we await for both results, whose async processes have already been started
const finalResult = [await someResult, await anotherResult];
// At this point all calls have been resolved
// Now when accessing someResult| anotherResult,
// you will have a value instead of a promise
Contoh JSbin: http://jsbin.com/xerifanima/edit?js,console
Peringatan: Tidak masalah jika await
panggilan berada di jalur yang sama atau di jalur yang berbeda, selama await
panggilan pertama terjadi setelah semua panggilan tidak sinkron. Lihat komentar JohnnyHK.
Pembaruan: jawaban ini memiliki waktu yang berbeda dalam penanganan kesalahan sesuai dengan jawaban @bergi , ia TIDAK membuang kesalahan saat kesalahan terjadi tetapi setelah semua janji dijalankan. Saya membandingkan hasilnya dengan tip @ jonny:, [result1, result2] = Promise.all([async1(), async2()])
periksa cuplikan kode berikut
const correctAsync500ms = () => {
return new Promise(resolve => {
setTimeout(resolve, 500, 'correct500msResult');
});
};
const correctAsync100ms = () => {
return new Promise(resolve => {
setTimeout(resolve, 100, 'correct100msResult');
});
};
const rejectAsync100ms = () => {
return new Promise((resolve, reject) => {
setTimeout(reject, 100, 'reject100msError');
});
};
const asyncInArray = async (fun1, fun2) => {
const label = 'test async functions in array';
try {
console.time(label);
const p1 = fun1();
const p2 = fun2();
const result = [await p1, await p2];
console.timeEnd(label);
} catch (e) {
console.error('error is', e);
console.timeEnd(label);
}
};
const asyncInPromiseAll = async (fun1, fun2) => {
const label = 'test async functions with Promise.all';
try {
console.time(label);
let [value1, value2] = await Promise.all([fun1(), fun2()]);
console.timeEnd(label);
} catch (e) {
console.error('error is', e);
console.timeEnd(label);
}
};
(async () => {
console.group('async functions without error');
console.log('async functions without error: start')
await asyncInArray(correctAsync500ms, correctAsync100ms);
await asyncInPromiseAll(correctAsync500ms, correctAsync100ms);
console.groupEnd();
console.group('async functions with error');
console.log('async functions with error: start')
await asyncInArray(correctAsync500ms, rejectAsync100ms);
await asyncInPromiseAll(correctAsync500ms, rejectAsync100ms);
console.groupEnd();
})();