Home  >  Article  >  Web Front-end  >  In-depth analysis of how to use Promise.allSettled()

In-depth analysis of how to use Promise.allSettled()

青灯夜游
青灯夜游forward
2021-10-13 10:00:463037browse

How to use Promise.allSettled()? The following article will take you to understand Promise.allSettled() and introduce how to use it. I hope it will be helpful to you!

In-depth analysis of how to use Promise.allSettled()

Promise.allSettled() The method returns a value when all given promises have been fulfilled or rejected# The promise after ## is accompanied by an object array, each object representing the corresponding promise result.

Next, let’s take a look at

Promise.allSettled() How it works.

1. Promise.allSettled()

Promise.allSettled() can be used to execute independent asynchronous operations in parallel and collect the results of these operations result.

This function accepts an array of

promise (usually an iterable object) as a parameter:

const statusesPromise = Promise.allSettled(promises);

When all input

promises are fulfilled or rejected, statusesPromise will resolve to an array with their status

  • { status: 'fulfilled', value: value } — If the corresponding promise has been fulfilled

  • or

    {status: 'rejected', reason: reason } If the corresponding promise has been rejected

In-depth analysis of how to use Promise.allSettled()

After resolving all promises, you can use

then Syntax to extract their status:

statusesPromise.then(statuses => {
 statuses; // [{ status: '...', value: '...' }, ...]
});

Or use

async/await Syntax:

const statuses = await statusesPromise;
statuses; // [{ status: '...', value: '...' }, ...]

2. Get fruits and vegetables

Before we delve into

Promise.allSettle(), let’s define two simple helper functions.

First,

resolveTimeout(value, delay) returns a promise, which is implemented with value after delay time has passed

function resolveTimeout(value, delay) {
  return new Promise(
    resolve => setTimeout(() => resolve(value), delay)
  );
}

Second,

rejectTimeout(reason, delay) - Returns a promise that is rejected after delay time with reason.

Finally, we use these helper functions to experiment with

promise.allsettle().

2.1 All promises fulfilled

We also visit the local grocery store for vegetables and fruits. Accessing each list is an asynchronous operation:

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'] }
// ]

Online example: https://codesandbox.io/s/all-resolved-yyc0l?file=/src/index.js

Promise.allSettled([...])Returns a promise statusesPromise, which is resolved within 1 second, just after the vegetables and fruits are resolved, solved in parallel.

statusesPromise Resolve as an array containing status.

  • The first item of the array contains the completed status of the vegetables:

    status: 'fulfilled', value: ['potatoes', 'tomatoes'] }

  • In the same way, the second item is the completion status of the fruit:

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

2.2 A promise is rejected

Imagine that there is no more fruit in the grocery store. In this case, we reject the fruit promise.

promise.allsettle() How does it work in this case?

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!') }
// ]

Online example: https://codesandbox.io/s/one -rejected-ij3uo?file=/src/index.js

Promise.allSettled([...]) The returned promise is in 1 seconds Then it is parsed into a status array:

  • The first item of the array, vegetables

    promise Successfully parsed: { status: 'fulfilled', value: [' potatoes', 'tomatoes'] }

  • ##The second item is a rejection status because the fruit promise was rejected:
  • { status: 'rejected', reason : Error('Out of fruits') }

  • Even if the second promise in the input array is rejected,
statusesPromise

will still successfully parse a status array.

2.3 All promises are rejected

What if the grocery store is sold out of vegetables and fruits? In this case, both promises will be rejected.

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!') }
// ]

Online example: https://codesandbox.io/s/all-rejected-z4jee?file=/src/index.js

In this case case,
statusesPromise

still successfully resolves to a status array. However, the array contains the status of rejected promises.

3. Summary

Promise.allSettled(promises)

You can run promises in parallel and collect the status (fulfilled or reject) into one in an aggregate array.

Promise.allSettled(...)

Effective when you need to perform parallel and independent asynchronous operations and collect all results, even though some asynchronous operations may fail. <blockquote> <p>English original address: https://dmitripavlutin.com/promise-all-settled/</p> <p>Author: Dmitri Pavlutin<br></p> </blockquote> <p>More programming related For knowledge, please visit: <a href="https://www.php.cn/course.html" target="_blank" textvalue="编程视频">programming video</a>! ! </p>

The above is the detailed content of In-depth analysis of how to use Promise.allSettled(). For more information, please follow other related articles on the PHP Chinese website!

Statement:
This article is reproduced at:dmitripavlutin.com. If there is any infringement, please contact admin@php.cn delete