Analisis mendalam tentang cara menggunakan Promise.allSettled()

青灯夜游
Lepaskan: 2021-10-13 10:56:11
ke hadapan
3020 orang telah melayarinya

Bagaimana untuk menggunakan Promise.allSettled()? Artikel berikut akan membawa anda memahami Promise.allSettled() dan memperkenalkan cara menggunakannya. Saya harap ia akan membantu anda. Kaedah

Analisis mendalam tentang cara menggunakan Promise.allSettled()

Promise.allSettled() mengembalikan fulfilled selepas semua janji yang diberikan telah rejected atau promise, dengan susunan objek, setiap objek An mewakili hasil janji yang sepadan.

Seterusnya, mari lihat cara Promise.allSettled() berfungsi.

1. Promise.allSettled()

Promise.allSettled() boleh digunakan untuk melaksanakan operasi tak segerak bebas secara selari dan mengumpul hasil operasi ini.

Fungsi ini menerima tatasusunan promise (biasanya objek boleh lelar) sebagai parameter:

const statusesPromise = Promise.allSettled(promises);
Salin selepas log masuk

Apabila semua input promises sama ada fulfilled atau rejected , statusesPromise akan menyelesaikan kepada tatasusunan dengan statusnya

  • { status: 'fulfilled', value: value } — jika janji yang sepadan telah atau fulfilled jika janji yang sepadan telah diselesaikan oleh

  • {status: 'rejected', reason: reason}rejected

  • Selepas menghuraikan semua janji, statusnya boleh diekstrak menggunakan sintaks
Sebelum ini, kami mentakrifkan dua fungsi

yang mudah. Analisis mendalam tentang cara menggunakan Promise.allSettled()

Pertama,

membalas janji yang ditepati dengan then setelah

masa berlalu
statusesPromise.then(statuses => {
 statuses; // [{ status: '...', value: '...' }, ...]
});
Salin selepas log masuk

async/awaitKedua,

- membalas janji, Tolak
const statuses = await statusesPromise;
statuses; // [{ status: '...', value: '...' }, ...]
Salin selepas log masuk
selepas

masa berlalu. Akhir sekali, kami mencuba

dengan fungsi pembantu ini.

Promise.allSettle()helper2.1 Semua janji ditepati

resolveTimeout(value, delay)Kami juga melawat kedai runcit tempatan untuk sayur-sayuran dan buah-buahan. Mengakses setiap senarai ialah operasi tak segerak:delayvalue

function resolveTimeout(value, delay) {
  return new Promise(
    resolve => setTimeout(() => resolve(value), delay)
  );
}
Salin selepas log masuk
Contoh dalam talian: https://codesandbox.io/s/all-resolved-yyc0l?file=/src/index.js

rejectTimeout(reason, delay)delayreason membalas janji

yang diselesaikan dalam masa 1 saat, sejurus selepas sayur-sayuran dan buah-buahan diselesaikan, secara selari.

promise.allsettle()

menyelesaikan kepada tatasusunan yang mengandungi keadaan.

Item pertama tatasusunan mengandungi status lengkap sayur-sayuran:

const statusesPromise = Promise.allSettled([
  resolveTimeout(['potatoes', 'tomatoes'], 1000),
  resolveTimeout(['oranges', 'apples'], 1000)
]);
// wait...
const statuses = await statusesPromise;
// after 1 second
console.log(statuses); 
// [
//   { status: 'fulfilled', value: ['potatoes', 'tomatoes'] },
//   { status: 'fulfilled', value: ['oranges', 'apples'] }
// ]
Salin selepas log masuk

Dengan cara yang sama, item kedua ialah buah-buahan Status siap:

Promise.allSettled([...])statusesPromise

2.2 Janji ditolak

statusesPromise

Bayangkan tiada lagi buah-buahan di kedai runcit. Dalam kes ini, kami menolak janji buah.
  • Bagaimanakah ia berfungsi dalam kes ini?status: 'fulfilled', value: ['potatoes', 'tomatoes'] }

  • Contoh dalam talian: https://codesandbox.io/s/one-rejected-ij3uo?file = /src/index.js

    { status: 'fulfilled', value: ['oranges', 'apples'] }

  • Janji yang dikembalikan dihuraikan ke dalam tatasusunan status selepas
saat:

Yang pertama daripada tatasusunan Item, sayur

berjaya dihuraikan:

promise.allsettle()

const statusesPromise = Promise.allSettled([
  resolveTimeout(['potatoes', 'tomatoes'], 1000),
  rejectTimeout(new Error('Out of fruits!'), 1000)
]);
// wait...
const statuses = await statusesPromise;
// after 1 second
console.log(statuses); 
// [
//   { status: 'fulfilled', value: ['potatoes', 'tomatoes'] },
//   { status: 'rejected', reason: Error('Out of fruits!') }
// ]
Salin selepas log masuk
Item kedua, kerana janji buah ditolak, berada dalam status penolakan:

Walaupun janji kedua dalam tatasusunan input ditolak, Promise.allSettled([...]) masih akan berjaya menyelesaikan tatasusunan status. 1

    2.3 Semua janji ditolak
  • promiseBagaimana jika kedai runcit itu habis dijual sayur-sayuran dan buah-buahan? Dalam kes ini, kedua-dua janji akan ditolak. { status: 'fulfilled', value: ['potatoes', 'tomatoes'] }

  • Contoh dalam talian: https://codesandbox.io/s/all-rejected-z4jee?file=/src/index.js

    { status: 'rejected', reason: Error('Out of fruits') }

    di Dalam kes ini,
  • masih berjaya menghuraikan ke dalam tatasusunan status. Walau bagaimanapun, tatasusunan mengandungi status janji yang ditolak.

statusesPromise3. Ringkasan

Janji boleh dijalankan secara selari dan status (ditepati atau ditolak) dikumpulkan ke dalam tatasusunan agregat.

berguna apabila anda perlu melakukan operasi tak segerak selari dan bebas dan mengumpul semua hasil, walaupun beberapa operasi tak segerak mungkin gagal.
const statusesPromise = Promise.allSettled([
  rejectTimeout(new Error('Out of vegetables!'), 1000),
  rejectTimeout(new Error('Out of fruits!'), 1000)
]);
// wait...
const statuses = await statusesPromise;
// after 1 second
console.log(statuses); 
// [
//   { status: 'rejected', reason: Error('Out of vegetables!')  },
//   { status: 'rejected', reason: Error('Out of fruits!') }
// ]
Salin selepas log masuk

Alamat asal bahasa Inggeris: https://dmitripavlutin.com/promise-all-settled/

Pengarang: Dmitri Pavlutin

Lebih banyak pengaturcaraan berkaitan Untuk pengetahuan, sila layari: Video Pengaturcaraan! !

Atas ialah kandungan terperinci Analisis mendalam tentang cara menggunakan Promise.allSettled(). Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Label berkaitan:
sumber:dmitripavlutin.com
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
Tentang kita Penafian Sitemap
Laman web PHP Cina:Latihan PHP dalam talian kebajikan awam,Bantu pelajar PHP berkembang dengan cepat!