Apa pendapat anda tentang Promise.allSettled()?
Bagi saya, allSettled kelihatan seperti penyelesaian untuk mencari masalah. Masalah itu ialah pembangun tidak mengendalikan ralat.
Promise.allSettled() mempunyai reka bentuk yang sangat mudah:
const allSettled = (promises) => Promise.all(promises.map(entry => entry .then((value) => ({ status: 'fulfilled', value })) .catch((reason) => ({ status: 'rejected', reason })) ));
Ia menyediakan objek hasil "konsisten" – baik, status adalah konsisten supaya anda boleh .filter() dengan lebih bersih daripada menggunakan Object.hasOwn(), tetapi nilai dan sebab sengaja berbeza supaya anda tidak boleh mencampurkannya.
Kebanyakannya, allSettled menambahkan .catch() pada setiap janji untuk anda.
Tetapi inilah perkara penting saya: jika anda memanggil sekumpulan perkhidmatan secara selari dan anda tahu satu atau lebih boleh gagal, namun ia tidak begitu penting...mengapa anda tidak menulis pengendalian ralat untuk itu?
const getFlakyService = (payload) => fetch(flakyUrl, payload); Promise.allSettled([ getFlakyService({ type: 'reptiles' }), getFlakyService({ type: 'mammals' }), getFlakyService({ type: 'birds' }), getFlakyService({ type: 'amphibians' }), ]).then((outcomes) => outcomes .filter(({ status }) => status === 'fulfilled')) });
Berapa banyak usaha yang kita simpan berbanding ini:
const getFlakyService = (payload) => fetch(flakyUrl, payload) // We don't really care about the failures .catch(() => undefined); Promise.all([ getFlakyService({ type: 'reptiles' }), getFlakyService({ type: 'mammals' }), getFlakyService({ type: 'birds' }), getFlakyService({ type: 'amphibians' }), ]).then((data) => { /* ... */ });
Jika anda mengambil berat tentang panggilan yang gagal, anda mungkin memerlukan maklumat permintaan yang boleh diakses untuk penjejakan, yang tidak dijamin tersedia dalam sebabnya. Promise.allSettled malah kurang membantu dalam kes ini dan lebih masuk akal untuk menulis pengendalian ralat anda sendiri.
const getFlakyService = (payload) => fetch(flakyUrl, payload) // Send the failures details to a tracking/logging layer .catch((error) => trackRequestError(flakyUrl, payload, error); Promise.all([ getFlakyService({ type: 'reptiles' }), getFlakyService({ type: 'mammals' }), getFlakyService({ type: 'birds' }), getFlakyService({ type: 'amphibians' }), ]).then((data) => { /* ... */ });
Saya akan membenarkan bahawa penyeragaman "hasil" boleh menjadi mudah. Dengan allSettled anda boleh mengira kegagalan setelah semuanya selesai. Tetapi itu benar dengan pengendalian ralat tersuai juga.
Saya akan terus menggunakan Promise.all() untuk masa terdekat, tetapi saya berminat untuk mendengar tentang kes penggunaan anda untuk Promise.allSettled() dan sebab anda memilihnya.
Atas ialah kandungan terperinci Adakah kita memerlukan Promise.allSettled()?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!