Хорошие обещания!
Они есть. Однако я заметил, что некоторые люди используют их неправильно или неоптимальным образом. Вот почему я хотел найти время, чтобы поделиться своим мнением о том, как их следует использовать.
Когда использовать обещания
В браузере и 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.
Надеюсь, вы что-то из этого вынесли.
Дайте мне знать, если вы согласны / не согласны или у вас есть вопрос.
Ваше здоровье!