Поиск по сайту
Ctrl + K
Вопросы по JS

Чем отличается Promise.all() от Promise.allSettled()?

Promise.all() и Promise.allSettled() — это два метода в JavaScript для работы с несколькими асинхронными операциями. Оба метода работают с массивом или итерируемым объектом, содержащим Promises, но есть несколько ключевых отличий в том, как они обрабатывают успешные и неуспешные операции.

1. Promise.all()

Promise.all() принимает массив или итерируемый объект, содержащий несколько Promises, и возвращает новый Promise. Этот новый Promise будет выполнен, когда все переданные Promises будут выполнены успешно. Если хотя бы один из Promises отклонится (возникнет ошибка), то Promise.all() сразу отклоняется, не дождавшись выполнения других Promises.

Пример:

let promise1 = Promise.resolve(1);
let promise2 = Promise.resolve(2);
let promise3 = Promise.reject('Ошибка!');

Promise.all([promise1, promise2, promise3])
  .then(results => {
    console.log(results);  // Это не будет выполнено, потому что promise3 отклоняется
  })
  .catch(error => {
    console.log(error);  // 'Ошибка!'
  });
  • Если все Promises успешно выполняются, Promise.all() вернет массив с результатами всех выполненных операций.
  • Если хотя бы один из Promises отклоняется, возвращается ошибка, и остальные Promises игнорируются.

2. Promise.allSettled()

Promise.allSettled() также принимает массив или итерируемый объект с Promises, но в отличие от Promise.all(), этот метод всегда завершится, когда все переданные Promises будут выполнены или отклонены. Независимо от того, произошла ли ошибка в одном из Promises, Promise.allSettled() возвращает результат для каждого Promise, содержащий информацию о том, был ли он выполнен или отклонен.

Пример:

let promise1 = Promise.resolve(1);
let promise2 = Promise.resolve(2);
let promise3 = Promise.reject('Ошибка!');

Promise.allSettled([promise1, promise2, promise3])
  .then(results => {
    console.log(results);  
    // [
    //   { status: 'fulfilled', value: 1 },
    //   { status: 'fulfilled', value: 2 },
    //   { status: 'rejected', reason: 'Ошибка!' }
    // ]
  });
  • Каждый результат в массиве будет объектом с двумя свойствами:
    • status: может быть 'fulfilled' (успешно выполнен) или 'rejected' (ошибка).
    • value (если выполнен) или reason (если отклонен), предоставляющий результат или причину ошибки.

Главное различие:

  • Promise.all() — отклоняется, если хотя бы один из Promises отклонен. Он не ждет выполнения других Promises, если один из них не удался.
  • Promise.allSettled() — всегда выполняется после завершения всех Promises, независимо от того, были ли они выполнены или отклонены. Он возвращает результаты всех операций, даже если некоторые из них не удались.

Когда использовать:

  • Используйте Promise.all(), когда вам нужно, чтобы все операции завершились успешно, и вы хотите сразу получить ошибку, если хотя бы одна операция не удалась.
  • Используйте Promise.allSettled(), если хотите получить результаты всех операций, независимо от того, были ли они успешными или нет. Это полезно, когда необходимо обработать как успешные, так и неудачные операции, не останавливая выполнение остальных.