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

Хороший способ думать об обещаниях — использовать аналогию из реальной жизни, такую ​​как ипотека. Допустим, я хочу купить дом, но сейчас у меня нет 100 000 фунтов стерлингов. Банк предлагает мне ипотечный кредит в размере 100 000 фунтов стерлингов и подписывает соглашение (немного похожее на знак), что деньги будут там когда-то в будущем. Теперь я могу использовать это соглашение, чтобы продолжать делать предложение продавцу, и они счастливы, зная, что это соглашение в конечном итоге обернется 100 000 фунтов стерлингов, на которые они рассчитывали.

Другая аналогия: если бы я заправил машину бензином и понял на кассе, что забыл бумажник, я мог бы дать кассиру подержать свой предмет (возможно, ценный), пока я пойду и возьму свой бумажник. . Это обещание, что предмет в конечном итоге превратится в реальные деньги, чего они и ожидали с самого начала. А пока просто подержите этот предмет, я вернусь через две минуты!

Дело в том, что ожидания нет (теоретически), мне не нужно было ждать, чтобы физически получить 100 000 фунтов стерлингов, поэтому я мог пойти дальше и сделать предложение. Кассиру не нужно было останавливаться, и он мог продолжать обслуживать клиентов, пока я ходил в fetch() свой кошелек.

В JavaScript функция может возвращать объект обещания в качестве заполнителя, этот заполнитель в конечном итоге будет заменен реальным значением, но пока просто удерживайте объект обещания. Это позволяет движку JavaScript продолжать работу, а не останавливаться и ждать реального значения.

Но как настроить, что произойдет, когда появится реальное значение? Мы используем метод .then() для объекта обещания.

например myPromise.then(разрешить, отклонить);

Успех и неудача — это функции, которые передаются в качестве аргументов. Если приходит реальное значение, то вызывается функция разрешения, в противном случае, если она терпит неудачу, вызывается функция отклонения.

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

Обещание имеет три состояния (ожидание, а затем разрешено или отклонено). Как только обещание превратилось в решение или отказ, оно уже не может быть отменено.

Метод .then() позволяет, например, объединить несколько элементов в цепочку:

myPromise.then( doSomething(data) ).then( doSomethingElse(data))

Это позволяет вам указать шаги, которые нужно предпринять после разрешения промиса. Цепочка также позволяет вам выполнять дополнительные промисы внутри промисов, по сути, это позволяет вам указать, что должно произойти и в каком порядке, независимо от того, сколько времени требуется для получения значений.

Для получения дополнительной информации я рекомендую эти две страницы из документов MDN: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Using_promises

Они дают действительно хорошее руководство по созданию ваших собственных промисов и их использованию для создания асинхронного программного обеспечения.

Этот пост является частью серии объяснений технических вопросов простым языком, вдохновленной цитатой физика Ричарда Фейнмана «Если вы не можете объяснить что-то простыми словами, вы этого не понимаете». Следите за обновлениями.