Rumah > hujung hadapan web > tutorial js > Adakah kita memerlukan Promise.allSettled()?

Adakah kita memerlukan Promise.allSettled()?

DDD
Lepaskan: 2024-11-30 16:47:14
asal
738 orang telah melayarinya

Do we need Promise.allSettled()?

Apa pendapat anda tentang Promise.allSettled()?

Bagi saya, allSettled kelihatan seperti penyelesaian untuk mencari masalah. Masalah itu ialah pembangun tidak mengendalikan ralat.

Konsep

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 }))
));
Salin selepas log masuk

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.

Tangani Kesilapan 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'))
});
Salin selepas log masuk

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) => { /* ... */ });
Salin selepas log masuk

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) => { /* ... */ });
Salin selepas log masuk

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.

Kesimpulan

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!

sumber:dev.to
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
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan