Хорошие обещания!

Они есть. Однако я заметил, что некоторые люди используют их неправильно или неоптимальным образом. Вот почему я хотел найти время, чтобы поделиться своим мнением о том, как их следует использовать.

Когда использовать обещания

В браузере и Node.js все операции ввода-вывода являются асинхронными. Следовательно, JavaScript нуждается в способе обработки асинхронного ввода-вывода. Промисы и их предшественники обратных вызовов используются именно для этого. Таким образом, первый и очевидный вариант использования промисов — это операции ввода-вывода.

Как насчет кода без ввода-вывода? Есть ли смысл заключать код, не связанный с вводом-выводом, в промисы?

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

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

Однако для большинства приложений, которые я видел, промисы нужны только для ввода-вывода.

Какой синтаксис использовать

Есть два известных синтаксиса для написания промисов. Первый основан на объекте Promise. Второй синтаксис, async & await, является лишь синтаксическим сахаром для операций, реализуемых объектом Promise.

Идут какие-то религиозные войны о том, что лучше. Простой ответ заключается в том, что вы можете и, вероятно, должны использовать оба.

Что можно и чего нельзя делать

Позвольте мне просто указать, что код, который я объявляю как «Нельзя», не является неправильным. Это рабочий код. Это просто код, который я бы написал по-другому.

Создание обещаний

Я бы всегда использовал ключевое слово async, чтобы моя функция возвращала обещание, и если мне нужно отклонить, выдавать ошибку. Синтаксис выглядит намного чище для меня.

Единственный раз, когда я буду использовать новый синтаксис Promise, — это обернуть устаревший API на основе обратного вызова в Promise.

Ожидание обещаний

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

Array.map с обещаниями

Это интересный миф: «Вы не можете использовать промисы с Array.map». Да, вы можете, и вы, вероятно, должны. Использование цикла for может привести к ожиданию слишком рано. Единственное, что вам нужно знать, это то, что если вы примените асинхронную функцию к Array.map, вы получите массив промисов. Это, в свою очередь, означает, что вам нужно развернуть эти промисы, если вы хотите получить доступ к их значениям. Для этого вы можете использовать Promise.all или Promise.allSettled.

Комбинируйте синтаксис

Вы видели, как я делаю это в каждом примере. Я использовал await плюс синтаксис .then(). Мое мнение здесь таково, что вы не должны использовать await для промежуточных вещей, таких как ответ, который еще нужно проанализировать. В общем, я предпочитаю избегать использования вспомогательных переменных. В идеале все переменные должны быть элементами предметной области, в которой я работаю, а не средством достижения моей логической реализации. Я бы даже дошел до того, что включил бы await a, за которым следует .then и .catch(), если это применимо.

Используйте бесточечный стиль

Я упоминал об этом в других сообщениях блога. Я большой поклонник бесточечного стиля и использовал бы для этого каррирование и частичное применение. Синтаксис Promise.then() и Promise.catch() — отличные кандидаты для использования этого стиля.

Не забудьте улов

Я имею в виду буквально. Обещания могут отклоняться, и вы должны обрабатывать эти ошибки. Для синтаксиса объекта Promise вы можете использовать .catch(). Для синтаксиса асинхронного ожидания вы можете использовать try-catch.

Спасибо, что позволили мне немного поворчать и поворчать о обещаниях JavaScript. Конечно, те же самые концепции применимы и к TypeScript.

Надеюсь, вы что-то из этого вынесли.

Дайте мне знать, если вы согласны / не согласны или у вас есть вопрос.

Ваше здоровье!