Adakah `Promise.all()` Menjamin Susunan Nilai Terselesai?

Mary-Kate Olsen
Lepaskan: 2024-11-03 05:40:02
asal
870 orang telah melayarinya

Does `Promise.all()` Guarantee the Order of Resolved Values?

Promise.all: Order of Resolved Values

Kaedah Promise.all() membolehkan pelaksanaan serentak dan resolusi berbilang janji, menawarkan pembangun alat yang berkuasa untuk pengaturcaraan tak segerak . Satu soalan yang menarik timbul mengenai susunan nilai yang diselesaikan dalam tatasusunan hasil Promise.all().

Menurut Rangkaian Pembangun Mozilla (MDN), hasil yang diperoleh daripada panggilan balik .then() Promise. all() nampaknya dipesan dalam urutan yang sama seperti yang dijanjikan input. Contohnya:

var somePromises = [1, 2, 3, 4, 5].map(Promise.resolve);
return Promise.all(somePromises).then(function(results) {
  console.log(results) //  is [1, 2, 3, 4, 5] the guaranteed result?
});
Salin selepas log masuk

Adakah tingkah laku ini dijamin oleh spesifikasi Promises? Mari kita mendalami butiran teknikal untuk mengetahui.

Memelihara Ketenteraman dalam Promise.all()

Dalam kaedah Promise.all(iterable), iterable mewakili koleksi janji. Fungsi PerformPromiseAll(iterator, constructor, resultCapability) digunakan secara dalaman, lelaran melalui iterable menggunakan IteratorStep(iterator).

Apabila janji diselesaikan dengan nilai yang diselesaikan, Promise.all() Resolve digunakan. Setiap janji yang diselesaikan membawa slot [[Indeks]] dalaman, menandakan kedudukannya dalam lelaran asal.

Oleh itu, output daripada Promise.all() mengekalkan susunan ketat yang sepadan dengan susunan janji dalam input boleh lelar. Ini berlaku selagi iterable yang disediakan dipesan dengan ketat, seperti tatasusunan.

Demonstrasi Pemeliharaan Pesanan

Berikut ialah contoh praktikal yang menggambarkan pemeliharaan pesanan dalam Promise.all():

<code class="javascript">// Used to display results
const write = msg => {
  document.body.appendChild(document.createElement('div')).innerHTML = msg;
};

// Different speed async operations
const slow = new Promise(resolve => {
  setTimeout(resolve, 200, 'slow');
});
const instant = 'instant';
const quick = new Promise(resolve => {
  setTimeout(resolve, 50, 'quick');
});

// The order is preserved regardless of what resolved first
Promise.all([slow, instant, quick]).then(responses => {
  responses.map(response => write(response));
});</code>
Salin selepas log masuk

Dalam senario ini, nilai 'semerta' diselesaikan serta-merta, diikuti dengan 'cepat' dan 'lambat'. Walau bagaimanapun, mengikut pemeliharaan pesanan dalam Promise.all(), hasilnya akan dipaparkan dalam urutan: 'perlahan', 'semerta', 'cepat', sejajar dengan susunan janji dalam tatasusunan input.

Atas ialah kandungan terperinci Adakah `Promise.all()` Menjamin Susunan Nilai Terselesai?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

sumber:php.cn
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan