Объясните Promise.allSettled() с асинхронным ожиданием в JavaScript

Опубликовано: 10 Августа, 2022

В этой статье мы попытаемся понять, как мы можем реализовать метод Promise.allSettled() с асинхронным ожиданием в JavaScript с помощью определенных примеров кода, а также теоретических объяснений. Давайте сначала быстро разберемся с методом Promise.allSettled(). Этот метод является одним из наиболее распространенных методов, доступных в объекте Promise, который выполняется, когда все промисы либо успешно разрешены, либо отклонены. Результатом этого метода будет массив из нескольких объектов (в зависимости от количества промисов, созданных пользователем), содержащий значение и статус каждого промиса в каждом объекте. Лучше использовать Promise.all(), если задачи зависят друг от друга или если мы хотим отклонить конкретное обещание в любой момент.

Синтаксис:

При реализации метода Promise.allSettled() предпочтительнее использовать следующий синтаксис:

Promise.allSettled([first_promise, second_promise, ...]).then(
    // do something...
)

Теперь, проанализировав приведенный выше синтаксис, мы увидим следующий пример, который поможет нам понять приведенный выше синтаксис гораздо лучше и эффективнее:

Пример 1: В этом примере мы будем создавать три обещания одно за другим. Каждое обещание будет содержать другую функцию таймера с разными тайм-аутами. После этого мы будем использовать метод Promise.allSettled(), который примет все три промиса в качестве входных данных в виде массива (или итерируемого объекта) и выполнит результат в соответствии со своей ролью.

Javascript




let first_promise = new Promise((resolve, reject) => {
    setTimeout(() => {
        resolve("GeeksforGeeks...!!");
    }, 1000);
});
  
let second_promise = new Promise((resolve, reject) => {
    setTimeout(() => {
        resolve("JavaScript......!!");
    }, 2000);
});
  
let third_promise = new Promise((resolve, reject) => {
    setTimeout(() => {
        resolve("TypeScript...!!");
    }, 3000);
});
  
let promise_array = [first_promise, second_promise, third_promise];
Promise.allSettled(promise_array).then((result) => console.log(result));

Выход:

[
  { status: "fulfilled", value: "GeeksforGeeks...!!" },
  { status: "fulfilled", value: "JavaScript......!!" },
  { status: "fulfilled", value: "TypeScript...!!" }
]

Теперь мы увидели, как реализовать метод Promise.allSettled(), давайте посмотрим, как реализовать этот метод с помощью ключевых слов async-await.

Пример 2. В этом примере мы будем создавать три обещания одно за другим (как мы делали в предыдущем примере). Каждое обещание будет содержать другую функцию таймера с разными тайм-аутами. Затем мы создадим функцию с ключевым словом async с префиксом, и внутри нее мы перехватим или сохраним наш результат, используя ключевое слово await . После этого мы будем использовать метод Promise.allSettled(), который примет все три промиса в качестве входных данных в виде массива (или итерируемого объекта) и выполнит результат в соответствии со своей ролью.

Javascript




let first_promise = new Promise((resolve, reject) => {
    setTimeout(() => {
        resolve("GeeksforGeeks...!!");
    }, 1000);
});
  
let second_promise = new Promise((resolve, reject) => {
    setTimeout(() => {
        resolve("JavaScript......!!");
    }, 2000);
});
  
let third_promise = new Promise((resolve, reject) => {
    setTimeout(() => {
        resolve("TypeScript...!!");
    }, 3000);
});
  
async function displayResult() {
    let promise_array = [first_promise, second_promise, third_promise];
    let result = await promise_array;
    Promise.allSettled(promise_array).then((result) => console.log(result));
}
  
displayResult();

Выход:

[
  { status: "fulfilled", value: "GeeksforGeeks...!!" },
  { status: "fulfilled", value: "JavaScript......!!" },
  { status: "fulfilled", value: "TypeScript...!!" }
]