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? });
Adakah tingkah laku ini dijamin oleh spesifikasi Promises? Mari kita mendalami butiran teknikal untuk mengetahui.
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.
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>
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!