Асинхронное кодирование в JavaScript иногда может действовать вам на нервы, особенно когда вы используете стиль передачи с продолжением. Это влияет на читаемость кода, затрудняя разделение на более мелкие независимые части, что приводит к тому, что код более подвержен ошибкам и в который трудно вносить изменения в будущем.

Если вы найдете способ писать асинхронный код в стиле, более близком к синхронному, ваша жизнь кодирования, безусловно, станет более приятной. Мы можем добиться этого с помощью обещаний JavaScript.

Давайте сначала попробуем выяснить, в чем проблема с использованием обратных вызовов.

Обратные вызовы ( стиль передачи сообщений )

Давайте рассмотрим пример, когда нам сначала нужно получить список стран, затем города первой страны, затем университеты первого города и, наконец, отобразить первый университет.

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

Так что же пошло не так в этой реализации?

Вместо того, чтобы хранить асинхронную логику в одном месте,

функции обратного вызова принимают решение, какую функцию вызывать следующей.

Короче говоря, мы выделили поток управления отдельным функциям, сделав их тесно связанными друг с другом.

Почему обещания?

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

  • Лучшее определение потока управления асинхронной логики
  • Пониженное сцепление
  • Лучшая обработка ошибок
  • Улучшенная читаемость

Использование обещаний

Обещания JavaScript позволяют вашему асинхронному вызову возвращать значение, подобное синхронной функции, это значение является объектом, который обещает успех или значение ошибки. Это небольшое изменение делает его действительно мощным в использовании.

Аналогично синхронному программированию; вывод одной функции является вводом следующей, вы можете использовать в цепочке функцию JS, такую ​​как «JSON.parse», их возвращаемое значение будет передано следующему обратному вызову.

Подобно JavaScript try / catch, если есть исключение, функция catch перехватит его, и приведенный ниже код продолжит работу в обычном режиме, а загрузчик всегда будет скрываться после выполнения.

Сравнение

Мы определили всю асинхронную логику в одном месте, нам не нужно ставить какие-либо дополнительные проверки или try / catch для обработки ошибок.

В результате код становится более читаемым, менее тесно связанным и имеет многоразовые независимые функции.

Подробная обработка ошибок

Всякий раз, когда возникает преднамеренное или непреднамеренное исключение, оно генерируется в следующем обработчике catch. Вы можете поместить обработчик catch в любое место цепочки, чтобы перехватить определенные исключения. Где вы можете отобразить ошибку или, возможно, повторно получить значение.

В приведенном выше примере второй оператор консоли не будет напечатан.

Если исключение перехвачено, и вы хотите передать его следующему обработчику перехвата, вы должны его выбросить.

Это становится удобным, например, когда вы хотите показать несколько сообщений об ошибках.

Обещания против слушателей событий

Слушатели событий полезны, если предполагается, что событие запускается несколько раз, например, событие нажатия кнопки. Обещания похожи на прослушиватели событий, но у них есть два основных отличия.

  • Обещание разрешается только один раз: либо в исключение, либо в значение.
  • Если вы добавите обратный вызов даже после выполнения обещания, он все равно будет вызываться. Это означает, что вы можете позже проверить, было ли оно выполнено или отклонено.

Это очень полезно, поскольку мы больше заинтересованы в реакции на исход происшествия.

Давайте рассмотрим простой пример предварительной загрузки изображения.

«Promise.all ([…])» может быть полезен для массового решения.

Заключение

В большинстве случаев обещания JavaScript могут быть действительно полезны, особенно когда обратный вызов успеха или неудачи может быть вызван только один раз. Но все же есть случаи, когда простые обратные вызовы лучше, особенно в случае событий, когда обратный вызов должен запускаться несколько раз.

Спасибо, что прочитали эту статью. Если у вас есть какие-либо вопросы, дайте мне знать в разделе комментариев.