Рубрики
Без рубрики

JavaScript, асинхронное программирование и обещания

В этом руководстве вы узнаете, каковы обещания в JS, которые содержат JavaScript Promise B … Теги от новичков, CodeNewie, JavaScript, WebDev.

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

Давайте попробуем это на шаг за шагом:

  1. В попробуйте Блок мы называем fetchuserdata Функция, которая возвращает Обещание в в ожидании государство.
  2. поймать Блок игнорируется, потому что в не было ошибок попробуйте блокировать. Асинхронное исполнение еще не бегало!
  3. Наконец линия отображается на экране.
  4. Ошибка возникает в асинхронном коде, и мы видим сообщение об ошибке в консоли – Unhandledpromiserejectwwarning

Чтобы избежать необработанных отклонений в обещаниях, вы всегда должны справиться с ними в .поймать () .

fetchUserData(userId).then(console.log).catch(handleError);

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

Вот интересный вопрос кодирующего интервью на Обработка ошибок в цепях обещания JavaScript Отказ

Узнайте полный стек JavaScript

Оригинал: “https://dev.to/coderslang/javascript-asynchronous-programming-and-promises-1epl”