Написание асинхронных программ на JavaScript
Нет сомнений в том, что JavaScript, несмотря на свою историю, сегодня стал одним из самых популярных языков программирования. JavaScript из-за своей асинхронной природы может представлять некоторые проблемы для тех, кто плохо знаком с этим языком. В этой статье мы собираемся написать небольшие асинхронные программы, используя промисы и async/await. Используя эти примеры, мы собираемся определить некоторые простые шаблоны, которые вы можете использовать для своих собственных программ.
Если вы новичок в JavaScript, вы можете сначала проверить мои другие
статья до прочтения этого.
Все примеры кода в этой статье написаны для среды Node. Если у вас не установлен Node, инструкции можно найти в Приложении 1. Несмотря на то, что все программы написаны для Node, вы можете применить те же принципы для сценариев, работающих в браузере. Кроме того, все примеры кода для этой статьи доступны на Гитлаб.
Независимо от того, верят ли люди в то, что JavaScript является настоящим языком программирования,
реальность такова, что в ближайшее время он никуда не денется. Если вы веб
разработчик, вы могли бы также потратить некоторое время и изучить его хорошие и плохие стороны.
JavaScript является однопоточным и поддерживает неблокирующие асинхронные потоки. если ты
новичок в языке, это может сильно разочаровать, когда что-то не работает
так, как вы ожидаете от них. Асинхронное программирование требует больше терпения и
другой тип мышления, отличный от синхронного программирования.
В синхронной модели все происходит последовательно, одно за другим. Потому что
из этого легче рассуждать о программах. Но в асинхронной модели
операции могут начинаться или заканчиваться в любом порядке в любой момент времени. Из-за
что просто полагаться на последовательность недостаточно. Асинхронное программирование
требует большего внимания с точки зрения потока программы и дизайна.
В этой статье мы рассмотрим пару коротких асинхронных программ. Мы
мы начнем с простых программ и постепенно перейдем к более сложным
те. Ниже приведен обзор сценариев, которые мы собираемся написать:
Сценарий, который записывает содержимое файла в новый файл.
Скрипт, который записывает содержимое нескольких файлов в новые файлы.
Скрипт, который анализирует и форматирует CSV-файлы в каталоге и выводит новый CSV-файл.
файлы в другую папку.
Давайте уделим немного времени и быстро рассмотрим основы промисов и async/await.
Обещания
Обещание — это объект, представляющий результат асинхронного
операция.Обещание либо разрешается со значением «успех», либо отклоняется с
значение «неудачи».Вообще говоря, доступ к разрешенным значениям осуществляется с помощью аргумента обратного вызова
аthen
блокировать. И отклоненные значения — это доступ с аргументом обратного вызова
кcatch
блокировать.В современных средах JavaScript вы можете получить доступ к конструктору промисов.
через глобальный объект какPromise
.Обещание может быть создано с помощью
Promise
конструктор с помощьюnew
ключевое слово. То есть:const p = new Promise((r, j) => {});
r
обратный вызов используется для разрешения промиса со значением иj
обратный вызов используется для отклонения обещания.Promise
конструктор имеет несколько полезных статических методов, таких какall
,race
,resolve
а такжеreject
.all
метод принимает массив обещаний и
попытается решить их все одновременно и вернет обещание, что
разрешается в массив с разрешенными значениями.race
методы занимают
массив обещаний и разрешает или отклоняет первое завершенное обещание.resolve
метод создает обещание и разрешает его в заданное значение.reject
метод создает обещание и отклоняет его с заданным значением.
Асинхронно/ждите
Назначение функций async/await — упростить поведение при использовании
промисы синхронно и выполнять некоторое поведение с группой промисов.
Из MDNТочно так же, как промисы похожи на структурированные обратные вызовы, async/await подобны
к объединению генераторов и промисов. Из MDNФункцию можно пометить как асинхронную с помощью
async
ключевое слово.
То есть:async function hello() {}
или жеconst hello = async() => {};
.Ан
async
функция всегда возвращает обещание. Если значение возвращается изasync
функция, она будет неявно заключена в обещание.Если возникает неперехваченное исключение внутри
async
функция,
возвращенное обещание отклоняется с исключением.await
оператор может использоваться внутриasync
функция перед операторами
которые возвращают обещание. В этом случае выполнение функции «приостанавливается».
пока обещание не будет разрешено или отклонено.await
оператор действителен только внутриasync
функция.
Вы можете прочитать остальную часть статьи на Medium.com