В этом руководстве вы узнаете, каковы обещания в JS, в которых говорится, что JavaScript обещают, и как обрабатывать асинхронные ошибки в обещаниях JS.
До сих пор вы работали только с регулярными ценностями. Вы создали переменную или постоянную, сохранили что-то там, и она была немедленно доступна для использования. Например, вы могли бы напечатать его к консоли.
Но что, если значение не появится немедленно, но какое-то время должно пройти первым? Мы часто получаем данные из базы данных или внешнего сервера. Эти операции требуют времени, и есть два способа работы с ними:
- Мы можем попытаться заблокировать выполнение программы, пока мы не получим данные
- Или мы можем продолжить выполнение и иметь дело с данными позже, когда оно появляется
Это не значит, что один метод определенно лучше другого. Обе устраивают различные потребности, поскольку нам нужно другое поведение в разных ситуациях.
Если данные, которые вы ждете, имеют решающее значение для продвижения вперед, то вам нужно заблокировать выполнение, и вы не можете обойти его. И если вы можете отложить обработку, то, конечно, это не стоит тратить время, потому что вы можете сделать что-то еще.
Что именно обещают JavaScript?
Обещание это особый тип объекта, который помогает вам работать с асинхронными операциями.
Многие функции вернут обещание вам в ситуациях, когда значение не может быть восстановлена немедленно.
const userCount = getUserCount(); console.log(userCount); // Promise {}
В этом случае GetUsercount
это функция, которая возвращает Обещание
Отказ Если мы попытаемся немедленно отображать значение Usercount
Переменная, мы получаем что-то вроде Обещание {
Отказ
Это произойдет, потому что нет данных, и нам нужно ждать этого.
Обещать штаты в JavaScript
Обещание может быть в нескольких штатах:
- В ожидании – Ответ еще не готов. Пожалуйста подождите.
- Выполнено – ответ готов. Успех. Принять данные.
- Отклонено – произошла ошибка. Справиться.
С в ожидании Состояние, мы не можем сделать ничего полезного, просто ждать. В других случаях мы можем добавить функции обработчика, которые будут вызваны, когда обещание входит в выполненное или отклоненное состояние.
Чтобы справиться с успешным получением данных, нам нужен тогда
функция.
const userCount = getUserCount(); const handleSuccess = (result) => { console.log(`Promise was fulfilled. Result is ${result}`); } userCount.then(handleSuccess);
И для обработки ошибок – поймать
Отказ
const handleReject = (error) => { console.log(`Promise was rejected. The error is ${error}`); } userCount.catch(handleReject);
Обратите внимание, что GetUsercount
Функция возвращает обещание, поэтому мы не можем напрямую использовать Usercount
Отказ Чтобы сделать что-то полезное с данными, когда оно появляется, нам нужно добавить обработчики к тогда
и поймать
Функции, которые будут вызываться в случае успеха или ошибки.
тогда
и поймать
Функции могут быть вызваны последовательно. В этом случае мы позаботимся о успехе и неудаче.
const userCount = getUserCount(); const handleSuccess = (result) => { console.log(`Promise was fulfilled. Result is ${result}`); } const handleReject = (error) => { console.log(`Promise was rejected. The error is ${error}`); } userCount.then(handleSuccess).catch(handleReject);
Обработка ошибок в JS обещает
Предположим, у нас есть getuserdata (usid)
Функция, которая возвращает информацию о пользователе или бросает ошибку, если есть некоторые проблемы с userid
параметр.
Ранее мы добавили обычные попробуйте/поймать
и обработал ошибку в блоке Catch.
try { console.log(getUserData(userId)); } catch (e) { handleError(e); }
Но ошибки, которые происходят в асинхронном коде внутри обещаний, не могут быть пойманы регулярными попробуйте/поймать
Отказ
Давайте попробуем заменить синхронную функцию getuserdata (usid)
, который немедленно возвращает результат, с асинхронной fetchuserdata (usid)
, что возвращает обещание.
Мы хотим сохранить поведение то же самое – отобразить результат, если это успешно, или обрабатывать ошибку, если это произойдет.
try { fetchUserData(userId).then(console.log); } catch (e) { handleError(e); }
Но нам не преуспеют. Нет проблем с синхронным кодом, чтобы выполнение продолжилось. Но когда в асинхронном коде возникает необработанная ошибка, мы получим НеудовлеченныйПромисерекция
И наша программа закончится.
Чтобы лучше понять порядок выполнения программы, давайте добавим Наконец
блокировать. Всегда будет работать (как и ожидалось), но он будет работать до или после НеобработанныйПромизерекция
?
try { fetchUserData(userId).then(console.log); } catch (e) { handleError(e); } finally { console.log('finally'); }
Давайте попробуем это на шаг за шагом:
- В
попробуйте
Блок мы называемfetchuserdata
Функция, которая возвращаетОбещание
вв ожидании
государство. -
поймать
Блок игнорируется, потому что вне было ошибок попробуйте
блокировать. Асинхронное исполнение еще не бегало! -
Наконец
линия отображается на экране. - Ошибка возникает в асинхронном коде, и мы видим сообщение об ошибке в консоли –
Unhandledpromiserejectwwarning
Чтобы избежать необработанных отклонений в обещаниях, вы всегда должны справиться с ними в .поймать ()
.
fetchUserData(userId).then(console.log).catch(handleError);
Код стал более коротким, уборщиком, и мы избавились от неожиданных ошибок, которые нарушали наш код.
Вот интересный вопрос кодирующего интервью на Обработка ошибок в цепях обещания JavaScript Отказ
Узнайте полный стек JavaScript
Оригинал: “https://dev.to/coderslang/javascript-asynchronous-programming-and-promises-1epl”