Обещания или фьючерсы, как их иногда называют, представляют будущую стоимость. Это полезно, когда значение недоступно прямо сейчас, но оно появится в будущем.
Хороший способ думать об обещаниях — использовать аналогию из реальной жизни, такую как ипотека. Допустим, я хочу купить дом, но сейчас у меня нет 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
Они дают действительно хорошее руководство по созданию ваших собственных промисов и их использованию для создания асинхронного программного обеспечения.
Этот пост является частью серии объяснений технических вопросов простым языком, вдохновленной цитатой физика Ричарда Фейнмана «Если вы не можете объяснить что-то простыми словами, вы этого не понимаете». Следите за обновлениями.