Seperti jawaban sebelumnya telah menyatakan, Promise.all
menggabungkan semua nilai yang diselesaikan dengan array yang sesuai dengan urutan input dari Janji asli (lihat Janji Agregat ).
Namun, saya ingin menunjukkan, bahwa pesanan hanya dipertahankan di sisi klien!
Bagi pengembang sepertinya Janji itu dipenuhi secara berurutan, tetapi dalam kenyataannya, Janji tersebut diproses dengan kecepatan yang berbeda. Ini penting untuk diketahui ketika Anda bekerja dengan backend jarak jauh karena backend mungkin menerima Janji Anda dalam urutan yang berbeda.
Berikut adalah contoh yang menunjukkan masalah dengan menggunakan batas waktu:
Janji
const myPromises = [
new Promise((resolve) => setTimeout(() => {resolve('A (slow)'); console.log('A (slow)')}, 1000)),
new Promise((resolve) => setTimeout(() => {resolve('B (slower)'); console.log('B (slower)')}, 2000)),
new Promise((resolve) => setTimeout(() => {resolve('C (fast)'); console.log('C (fast)')}, 10))
];
Promise.all(myPromises).then(console.log)
Dalam kode yang ditunjukkan di atas, tiga Janji (A, B, C) diberikan kepada Promise.all
. Tiga Janji dijalankan dengan kecepatan yang berbeda (C menjadi yang tercepat dan B menjadi yang paling lambat). Itu sebabnya console.log
pernyataan Janji muncul dalam urutan ini:
C (fast)
A (slow)
B (slower)
Jika Janji adalah panggilan AJAX, maka backend jarak jauh akan menerima nilai-nilai ini dalam urutan ini. Tetapi di sisi klien Promise.all
memastikan bahwa hasilnya dipesan sesuai dengan posisi asli myPromises
array. Itu sebabnya hasil akhirnya adalah:
['A (slow)', 'B (slower)', 'C (fast)']
Jika Anda ingin menjamin juga pelaksanaan aktual Janji Anda, maka Anda akan memerlukan konsep seperti antrian Janji. Berikut ini adalah contoh menggunakan p-antrian (hati-hati, Anda harus membungkus semua Janji dalam fungsi):
Antrian Janji Berurutan
const PQueue = require('p-queue');
const queue = new PQueue({concurrency: 1});
// Thunked Promises:
const myPromises = [
() => new Promise((resolve) => setTimeout(() => {
resolve('A (slow)');
console.log('A (slow)');
}, 1000)),
() => new Promise((resolve) => setTimeout(() => {
resolve('B (slower)');
console.log('B (slower)');
}, 2000)),
() => new Promise((resolve) => setTimeout(() => {
resolve('C (fast)');
console.log('C (fast)');
}, 10))
];
queue.addAll(myPromises).then(console.log);
Hasil
A (slow)
B (slower)
C (fast)
['A (slow)', 'B (slower)', 'C (fast)']