Введение обещаний

Представьте, что вы известный писатель, и ваши поклонники ждут, чтобы прочитать вашу последнюю книгу. Чтобы получить некоторое облегчение, вы обещаете отправить им копию, когда публикация будет завершена. Они заполняют форму для своего адреса доставки, поэтому копия будет отправлена ​​им. Если что-то пойдет не так, они все равно будут уведомлены в любом случае. Это реальная аналогия того, что делает обещание.

Обещания используются для обработки асинхронных операций в Javascript. Когда обещание создается, запускается производящий код, который в конечном итоге даст результат. В Javascript, чтобы лучше избежать передачи функций обратного вызова в функцию, что приводит к коду, которым трудно управлять и читать, можно использовать промисы.

Синтаксис и свойства промисов

Объект обещания Javascript может быть выполнен, отклонен или ожидает выполнения. Если он выполнен, результатом является значение, когда он отклонен, результатом является объект ошибки, когда он находится в ожидании, результат не определен.

Промис может быть создан с помощью конструктора промисов и принимает один аргумент, функцию обратного вызова с двумя аргументами: разрешить и отклонить. Когда функция обратного вызова выполняется, она вызывает разрешение, если все прошло хорошо, или отклоняет, если желаемая операция не была достигнута.

var promise = new Promise((myResolve, myReject) => {
// Code that takes some time

  myResolve(); // call this when success
  myReject();  // call this when error
});

// Code that waits the fulfillment of Promise
myPromise.then(
  function(value) // if successful 
  function(error) // if error 
);

Promise.all против Promise.race

Объект Promise в Javascript предлагает встроенные методы, такие как Promise.all и Promise.race.

Promise.all принимает итерацию промисов в качестве входных данных и возвращает один промис результатов введенных промисов после попытки выполнить все из них. Если одно из этих обещаний ввода будет отклонено, оно завершится. Представьте себе, что вы посещаете страницу своего блога. Необходимо выполнить несколько требований, таких как просмотр содержимого, сохраненных блогов и взаимодействие с панелью навигации. Если какая-либо из этих вещей не отображается должным образом, вы будете перенаправлены в другое место. Поскольку все эти операции жизненно важны для взаимодействия пользователя с сайтом, можно использовать Promise.all, и в этом случае он будет отклонен при отказе одной из функций.

const promise1 = Promise.resolve(3);
const promise2 = 22;
const promise3 = new Promise((resolve, reject) => {
  setTimeout(resolve, 100, 'foo');
});
Promise.all([promise1, promise2, promise3]).then((values) => {
  console.log(values);
});
// expected output: Array [3, 22, "foo"]

Promise.race принимает итерируемый объект, такой как массив промисов и возвращаемое значение ожидающего промиса. Как и название, эти обещания будут соревноваться друг с другом. Метод вернет первоеурегулированное обещание, которое разрешено или отклонено, после чего завершится. В приведенном ниже примере promise2 выполняется быстрее, поэтому он будет разрешен первым.

const promise1 = new Promise((resolve, reject) => {
  setTimeout(resolve, 500, 'one');
});
const promise2 = new Promise((resolve, reject) => {
  setTimeout(resolve, 100, 'two');
});
Promise.race([promise1, promise2]).then((value) => {
  console.log(value);

});
// expected output: "two"

Promise.all не может обрабатывать частичные отказы, если одно из обещаний отклонено, весь процесс существует с обратным вызовом отказа. Promise.race не ждет, пока все обещания будут разрешены, прежде чем вернуть разрешенное обещание. Выбор одного над другим зависит от того, что нам нужно выполнить.

Ресурсы: