Javascript считается однопоточным или синхронным, потому что он может выполнять только одну инструкцию за раз. Часто при написании сложных и замысловатых фрагментов кода возникают сложности, когда выполнение определенных операций или функций занимает много времени. Эти типы операций / функций также известны как блокирующий код. Блокирующий код - это просто код, выполнение которого занимает продолжительное время, что замедляет выполнение / рендеринг. оставшейся части скрипта, потому что Javascript снова синхронный. Если мы постоянно ждем, пока наш javascript выполнит какую-то длительную операцию, наша страница не будет отвечать пользователям, поскольку части нашего пользовательского интерфейса не будут отображаться.
Вместо того, чтобы постоянно ждать, пока наш код запустится синхронно, мы хотим, чтобы какой-то код можно было запустить позже, чтобы другие части нашего пользовательского интерфейса не были заблокированы длиной, необходимой для того, чтобы этот код завершил работу. Мы хотим, чтобы наш JavaScript выполнялся асинхронно.
Что такое обещание?
ES6 был наполнен множеством новых функций, которые помогли упростить жизнь разработчикам. Одной из самых полезных функций были обещания. Обещания - это еще один способ написания асинхронного кода, который чрезвычайно полезен при работе с блокирующим кодом.
- Объект Promise представляет собой окончательное завершение (или сбой) асинхронной операции и ее результирующее значение. - мдн статья об обещаниях
По сути, это означает, что они представляют собой обещание определенной ценности, которой у нас пока нет. Обещания просто представляют некоторые данные / значения, которые мы будем иметь позже. Это особенно полезно при выполнении HTTP-запросов, выполнение которых занимает произвольное время. Обещания позволяют писать чистый код, не ориентированный на обратный вызов. Даже если вы никогда не пишете собственное обещание, знание того, как они работают, невероятно важно, поскольку многие новые части JavaScript API используют обещания вместо обратных вызовов.
Терминология обещания
Обещание может быть:
- выполнено - действие, связанное с обещанием, выполнено успешно.
- отклонено - действие, связанное с обещанием, не выполнено.
- на рассмотрении - еще не выполнено или отклонено
- урегулирован - выполнил или отклонил
Когда вы пытаетесь понять обещания, полезно рассматривать их по двум категориям: состояния и судьбы. Обещания могут иметь одно из трех взаимоисключающих состояний: выполнено, отклонено и отложено. Обещания также могут иметь одну из двух взаимоисключающих судеб: решенную или нерешенную. Обещание, судьба которого решена, может находиться в любом из трех состояний. Мы говорим, что обещание выполнено, если оно не ожидает, то есть если оно выполнено или отклонено. Урегулирование - это не состояние, это просто лингвистическое удобство и обещание, судьба которого не решена, обязательно ожидается.
Методы обещания
- .then () - Метод
then()
возвращаетPromise
. Он принимает до двух аргументов: функции обратного вызова для случаев успеха и неудачиPromise
- Статья MDN о Promise.prototype.then ()
Метод .then () ведет себя аналогично обратному вызову прослушивателя событий. Как и прослушиватели событий, .then
ожидает определения функции, а не ее вызова. Он запустит вашу функцию, как только обещание будет разрешено. Еще одна прекрасная особенность метода .then () заключается в том, что он может быть связан с цепочкой, что означает, что вы можете буквально добавлять операцию за операцией, чтобы выполнять свое обещание, пока не достигнете желаемого результата.
- .catch () - Метод
catch()
возвращаетPromise
и обрабатывает только отклоненные обращения. Он ведет себя так же, как вызов «Promise.prototype.then(undefined, onRejected)
(фактически, вызовobj.catch(onRejected)
внутренне вызываетobj.then(undefined, onRejected)
). Это означает, что вы должны предоставить функциюonRejected
, даже если вы хотите вернуться к результатуundefined
- например, _12 _ »- Статья MDN onPromise.prototype.catch ()
Метод .catch () больше используется для обработки ошибок. Этот метод очень полезен в тех случаях, когда наше обещание отклоняется. Метод .catch (), по сути, является способом обработки отклоненного обещания, и поскольку он также возвращает обещание, подобное методу .then (), метод . catch () также может быть связан с цепочкой.
Пример
В приведенном выше примере мы видим базовую архитектуру обещания. Мы создали новую переменную p и присвоили новому объекту обещание. Этот объект обещания будет принимать один параметр, который является функцией, которой передаются две переменные resolved и reject. Затем мы определили некоторое обещание внутри нашей функции, в нашем случае мы сделали его простым дополнительным утверждением. Мы также передали сообщение в наши переменные разрешения и отклонения, чтобы визуализировать, откуда приходит сообщение. Мы вызываем наше обещание, добавляя метод .then (), поскольку наше обещание было выполнено, мы можем видеть наше сообщение console.logged с переданным правильным сообщением. В приведенном ниже примере мы изменили утверждение добавления, сделав его ложным, чтобы мы могли вызвать ошибку и увидеть, как наш метод .catch () успешно выполняется. Вы можете видеть, что сообщение было изменено в связи с изменением условий обещания.
Заключение
По сути, обещание ведет себя очень похоже на прослушиватели событий, за исключением:
- Обещание может быть успешным или неудачным только один раз
- Он не может переключиться с успеха на неудачу или наоборот.
- В зависимости от судьбы обещания будет вызываться правильный обратный вызов, несмотря на то, что событие произошло в другое время.
Обещания очень полезны для разработчиков JavaScript. Они помогают запускать наш javascript-код асинхронно и помогают нам не попасть в ад обратных вызовов. Эта идея очень удобна, потому что теперь мы сместили наши интересы с момента, когда что-то стало доступным, на реакцию на результат чего-то. Эти темы могут быстро стать очень сложными, но при правильном использовании могут оказаться очень важными. Если у вас есть комментарии или предложения, не стесняйтесь оставлять комментарии ниже. Всем удачи!!!