В этом руководстве вы узнаете, каковы обещания в 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”