Async / Await: герой JavaScript заслуживает
Написание асинхронного кода сложно. Когда дело доходит до JavaScript, мы в значительной степени полагаемся на функции обратного вызова для выполнения асинхронных задач, которые могут быть далеко не интуитивными. Эти когнитивные издержки создают барьер для входа для новичков в программировании и языке и даже вызывают частые изжоги у тех из нас, кто некоторое время использовал этот язык.
В этой статье мы рассмотрим, как можно использовать предложение для ECMAScript 2016 (ES7), чтобы улучшить наш опыт работы с асинхронным программированием в JavaScript , делая наш код легче для понимания и проще для написания.
Мир сегодня
Давайте начнем с рассмотрения попытки асинхронного программирования сегодня. В следующем примере используется запрос библиотека, чтобы сделать HTTP-запрос к API Ron Swanson Quotes и распечатать ответ на консоль. Сделайте это, вставив следующее в файл с именем app.js и запустив npm install для установки зависимости. Если у вас не установлен Node.js, вы можете получить его из Вот ,
var request = require ('request'); function getQuote () {var quote; request ('http: //ron-swanson-quotes.herokuapp.com/v2/quotes', function (error, response, body) {quote = body;}); возврат цитаты; } function main () {var quote = getQuote (); приставка . журнал (цитата); } главный ();
Если вы работали с асинхронным программированием в JavaScript раньше, возможно, вы уже заметили, почему мы не получим цитату из этого кода. Если это так, то высокие пять.
Запустив его с узлом app.js, вы быстро увидите распечатанное неопределенное.
Почему это происходит?
Причина, по которой переменная кавычки не определена, заключается в том, что функция обратного вызова, которая ее назначает, не вызывается до тех пор, пока не завершится вызов функции запроса. Но поскольку функция запроса выполняется асинхронно, JavaScript не ждет, пока она завершится. Вместо этого он переходит к следующему оператору, который возвращает неназначенную переменную. Для лучшего объяснения того, как асинхронность в JavaScript работает под капотом, посмотрите этот удивительный разговор Филип Робертс в ЗАО на ЕС.
Синхронный код, как правило, легче понять и написать, потому что все выполняется в том порядке, в котором он написан. Операторы return широко используются и довольно интуитивно понятны в других языках, но, к сожалению, мы не можем использовать их так, как хотелось бы в JavaScript, потому что они плохо работают с асинхронной природой JavaScript.
Так зачем проходить борьбу с асинхронным кодом? Спектакль. Сетевые запросы и чтение с диска - это то, что мы называем операциями ввода / вывода (ввода / вывода). При синхронном выполнении ввода / вывода программа блоки , сидя и ожидая завершения передачи данных. Если для завершения запроса к базе данных требуется 60 секунд, программа бездействует в течение 60 секунд. Однако во время асинхронной операции ввода-вывода программа может возобновить нормальное выполнение и обрабатывать результаты операции ввода-вывода всякий раз, когда они появляются. Вот почему существуют функции обратного вызова, но с обратными вызовами работать гораздо сложнее, и при чтении исходного кода приложения они не работают.
утопия
Можем ли мы получить лучшее из обоих миров - асинхронный код, который позволяет нам работать с блокирующими операциями, но также легче читать и писать? Ответ да благодаря ES7 предложение для асинхронных функций (Async / Await).
Когда функция объявлена как асинхронная, она может выполнить выполнение вызывающему коду, ожидая разрешения обещания. Если вы не знакомы с обещаниями, посмотрите один из эти отличный Ресурсы.
Вы можете заменить код в app.js следующим. Нам также нужно будет установить галдеж Транспортер для запуска. Сделайте это с помощью npm install babel. Babel превратит наш новейший код ES7 в версию, которая работает в современных условиях. Вы можете узнать больше о Вавилоне Вот ,
var request = require ('request'); function getQuote () {var quote; вернуть новое обещание (функция (разрешить, отклонить) {запрос ('http: //ron-swanson-quotes.herokuapp.com/v2/quotes', функция (ошибка, ответ, тело) {quote = body; разрешить (quote) ;});}); } асинхронная функция main () {var quote = await getQuote (); приставка . журнал (цитата); } главный (); приставка . журнал («Рон однажды сказал»);
Вы можете видеть, что мы возвращаем обещание, которое оборачивает сетевой запрос внутри нашей новой функции getQuote.
Внутри обратного вызова, переданного запросу, мы вызываем функцию разрешения обещания с телом результата.
Выполните следующее, чтобы запустить этот пример.
./ node_modules /. bin / babel - узел приложения. js // Рон однажды сказал, // {"quote": "Еда на завтрак может служить многим целям."}
Ого. Этот код выглядит довольно круто и близок к первоначальной попытке. Это выглядит довольно синхронно, хотя это не так.
«Если вы не заметили, - сказал однажды Рон, - сначала напечатали, несмотря на то, что его вызвали после мэйн» Это показывает, что мы не блокируем в ожидании завершения сетевого запроса.
Делать улучшения
На самом деле мы можем улучшить это, добавив обработку ошибок с помощью блока try / catch. Если во время запроса произошла ошибка, мы можем вызвать функцию отклонения обещания, которая будет обнаружена как ошибка внутри main. Как и операторы return, блоки try / catch в прошлом использовались очень редко, поскольку их было трудно правильно использовать с асинхронным кодом.
var request = require ('request'); function getQuote () {вернуть новое обещание (функция (разрешить, отклонить) {запрос ('http: //ron-swanson-quotes.herokuapp.com/v2/quotes', function (error, response, body) {if (error ) возврат отклонить (ошибка); решить (тело);});}); } асинхронная функция main () {try {var quote = await getQuote (); приставка . журнал (цитата); } catch (error) {console. ошибка (error); } } главный (); приставка . журнал («Рон однажды сказал»);
Запустите этот код еще раз, и вы увидите, что исключение перехватывается, если изменить URL-адрес запроса на что-то вроде http: // foo.
Выгоды
Это довольно удивительные преимущества, которые действительно изменят способ написания асинхронного JavaScript. Возможность писать код, который выполняется асинхронно, но выглядит синхронно и упрощает использование общих программных конструкций, таких как return и try / catch, безусловно, поможет сделать язык более доступным.
Самое приятное, что мы можем использовать нашу новую любимую функцию со всем, что возвращает обещание. Давайте возьмем Библиотека Twilio Node.js например. Если вы еще не использовали библиотеку Twilio Node.js, прежде чем сможете узнать больше об этом Вот , Вы также должны иметь учетную запись Twilio, на которую вы можете зарегистрироваться Вот ,
Начните с запуска npm и установите twilio. Затем вставьте следующее в файл с именем twilio.js и замените поля в строках, помеченных // TODO, своими учетными данными и номерами.
./ node_modules /. bin / babel - узел twilio. js var twilio = require ('twilio'); var client = новый twilio ('YOUR_TWILIO_ACCOUNT_SID', 'YOUR_TWILIO_AUTH_TOKEN'); // Асинхронная функция TODO sendTextMessage (to) {try {await client. Сообщения . create ({to: to, from: 'YOUR_TWILIO_PHONE_NUMBER', // тело TODO: 'Hello, Async / Await!'}); приставка . журнал («Запрос отправлен»); } catch (error) {console. ошибка (error); }} sendTextMessage ('YOUR_PHONE_NUMBER'); // Консоль TODO. log («Я печатаю первым, чтобы показать, что я асинхронный!»);
Как мы показали выше с функцией getQuote, мы пометили sendTextMessage как async, что позволяет ему ожидать разрешения обещания, возвращенного из client.sendMessage.
Завершение
Мы видели, как мы можем воспользоваться предложенной функцией ES7 для улучшения нашего опыта написания асинхронного JavaScript.
Я очень рад за предложение Async / Await двигаться вперед. Пока мы ждем этого, мы можем использовать Babel, чтобы воспользоваться этим сегодня с чем угодно, что возвращает обещание. Предложение недавно достигло стадии кандидата (стадия 3) и нуждается в использовании и Обратная связь ,
Попробуйте использовать его со следующей замечательной вещью, которую вы создадите, и обязательно сообщите мне об этом в комментариях или в Твиттере @eddiezane , И обязательно попробуйте Twilio's JavaScript и Node.js Учебники а также руководства на нашем сайте документации.
Похожие
Раппен - это бриз с алгоритмом DeepBeatВпервые появился на WIRED.de С DeepBeat каждый может написать свой собственный рэп-текст, о котором нужно позаботиться. Программа была разработана исследовательской группой из отделов информатики Университета Аалто и Университета Хельсинки. Для ученых DeepBeat использовался только как инструмент исследования, теперь это программное обеспечение открыто для публики публично , DeepBeat работает с использованием алгоритма, который способен распознавать Данные в облаке - это вообще безопасно?
Все больше и больше слышно о хранении данных в облаке. Возможно, многие из вас используют их или слышат о них впервые. Вам не нужно покупать подходящее оборудование, чтобы хранить то, что важно для нас. Прежде чем мы перейдем к безопасности данных, хранящихся в облаке, важно объяснить, что такое облако. Журнал квестов: Голени однажды и сегодня
Tibia, несмотря на почти двадцать лет (20-й день рождения в январе) на рынке, по-прежнему пользуется значительной популярностью среди поклонников жанра MMORPG. Как Top Takeaway 2015 - Проверка лучших ресторанов - zajadam.pl
«Скрытая правда» ТВН лучше, чем «Почему я?» Полсат
«Скрытая правда» дебютировала на TVN 13 февраля этого года. и транслируется в будние дни в 16.55. За первые четыре недели трансляции сериал собрал в среднем 2,42 миллиона зрителей с долей 20,57 процента. в группе всех зрителей и 21,61 процента. в коммерческой группе 16-49 - показать данные измерений аудитории Nielsen для Wirtualnemedia.pl. Для сравнения, год назад в этой группе TVN было 2,1 миллиона зрителей и 18,34 процента соответственно. и 16,17 процента. Обзор Huawei Mate 8: большой и смелый
Позиционирование Huawei в области мобильных телефонов довольно хорошо установлено, причем подавляющее большинство его телефонов вписывается в бюджетные и средние зоны. Линия Mate - это удар Huawei по телефону премиум-класса, но, как и Совершенно пьяный водитель грузовика нес 24-тонный груз. Это было 3,5 промилле
Пьяный водитель грузовика въехал в грузовик на кольцевой автодороге Легницы (Нижнесилезская губерния), а затем скрылся. Он пытался забаррикадироваться в кабине, и когда полицейские наконец проникли внутрь, они должны были вытащить его из машины. Оказалось, что у него было 3,5 промилле алкоголя в организме, и он не мог отделаться. Записывать 360 ° фильмы на смартфоне Android? Это возможно благодаря Insta360 Air
Вы помните Insta360 Air? Эта функциональная сферическая камера для смартфонов Android только что вышла на рынок. Цена может удивить. Когда в середине 2016 года был представлен iPhone, посвященный iPhone Insta360 Nano Пользователи Adroid, которые позволяли создавать видеоролики и фото сферы с помощью смартфона, могли немного разочароваться, что производитель Почему мобильный спутник летит высоко
... делать все это практически из любой точки планеты. Более того, они все более доступны, чем сценарий обычного спутникового телефона, который я описал. Новые спутниковые гаджеты: дешево, совместимо и гибко Компания под названием Bivy App создает продукт под названием Bivystick , Это не спутниковый телефон, а устройство, которое подключается к вашему «С немецкой точки зрения, это идеал - Дональд Туск и его надежность»
- Туск делает то, что хочет Германия, или делает то, что ей нужно, и тогда проблем нет. Они восхваляют этот период как веху в польско-германских отношениях. Проблем просто не было, - сказал историк проф. Богдан Мусял, комментируя польско-германские отношения в последние годы. Почему кот мочится на кровать ?! Мы советуем вам, как решить проблему
Вы снабдили свой трюфель красивой и большой коробкой для мусора. Вы налили ароматный гравий. Вы чистите это так часто, как можете, но этот, несмотря на это, пописает в вашу кровать? Многие воспитатели сталкиваются с этой неприятной проблемой. И многие, к сожалению, не в силах с этим справиться, избавляются от кота. Это ужасно, потому что причина такого поведения совершенно не злая. Так почему кот мочится на кровать? Как ни парадоксально, он может сделать это ... из любви. С каких
Комментарии
Почему 64-разрядные операционные системы не могут запускать 16-разрядные приложения?Почему 64-разрядные операционные системы не могут запускать 16-разрядные приложения? Почему 64-разрядные операционные системы не могут запускать 16-разрядные приложения? Почему ваш 64-битный компьютер не может запускать ваши старые 16-битные приложения? Вот почему, плюс несколько обходных путей, которые вы можете использовать в любом случае. Прочитайте Вы чистите это так часто, как можете, но этот, несмотря на это, пописает в вашу кровать?
Вы чистите это так часто, как можете, но этот, несмотря на это, пописает в вашу кровать? Многие воспитатели сталкиваются с этой неприятной проблемой. И многие, к сожалению, не в силах с этим справиться, избавляются от кота. Это ужасно, потому что причина такого поведения совершенно не злая. Так почему кот мочится на кровать? Как ни парадоксально, он может сделать это ... из любви. С каких это пор? Основной вопрос, который мы должны задать себе, заключается в следующем: кошка Хорошо, если мы сфокусируемся на максимуме, мы найдем точку с минимальной разницей, но зачем это делать?
Хорошо, если мы сфокусируемся на максимуме, мы найдем точку с минимальной разницей, но зачем это делать? РЕЗЮМЕ Sony Xperia E4G, безусловно, является одним из лучших бюджетных смартфонов, которые я когда-либо тестировал. Он не сбивает с толку дизайн, но гарантирует надежную, комфортную и продолжительную работу, а также неплохо справляется с тестами производительности. Услуга LTE является большим преимуществом, поэтому у нас есть гарантия высокоскоростного Интернета как часть Если карьера начинается в Яроцине, то это должно что-то значить, но легче ли это молодой, амбициозной команде?
Если карьера начинается в Яроцине, то это должно что-то значить, но легче ли это молодой, амбициозной команде? На этот вопрос ответит вокалист Neons - Давид Зайц. Из интервью вы также узнаете о его увлечениях чтением и о том, где их можно найти во Вроцлаве. А 31 июля вы сможете купить их рекорд. Моника Матура: Ссылка на успех в Яроцине в 2010 году ... Это слишком хорошо, чтобы быть правдой, или это телевизор, который сделает Hisense нарицательным?
Это слишком хорошо, чтобы быть правдой, или это телевизор, который сделает Hisense нарицательным? Отправляйся в наш Hisense H55N6800 обзор выяснить. Hisense H49N5700 Ниже диапазона 6800 находятся 55-, 49- и 43-дюймовые 5700 комплектов. Все они 4K с HDR, но с их более толстыми Однажды кто-то может шаг за шагом взять мою руку, чтобы научиться это делать?
Это слишком хорошо, чтобы быть правдой, или это телевизор, который сделает Hisense нарицательным? Отправляйся в наш Hisense H55N6800 обзор выяснить. Hisense H49N5700 Ниже диапазона 6800 находятся 55-, 49- и 43-дюймовые 5700 комплектов. Все они 4K с HDR, но с их более толстыми Это почему?
Это почему? В конце концов, они довольно недорогие. Может быть, это потому, что эти гарнитуры требуют совместимого телефона для питания и дисплея. 1/4 карман-линт Новый Daydream View работает с любым телефоном Google Pixel или Daydream-ready. В настоящее время это только 12 телефонов Android: Moto Z, Moto Z2, Huawei Mate 9 Pro, ZTE Axon 7, Asus ZenFone AR, Samsung Galaxy Note 8, Galaxy S8, Galaxy S8 Plus, Google Pixel, Pixel XL, Pixel 2 и Пиксель 2 XL. Теперь эти телефоны Что делать, когда происходит авария?
Что делать, когда происходит авария? Как и в случае любого другого дорожного происшествия, мы должны обеспечить безопасность место аварии , Правильно установленный треугольник и аварийное освещение отметят нашу позицию и привлекут внимание встречных водителей. Мы сможем безопасно обратиться за помощью, когда возникнет такая необходимость. На следующем этапе мы должны позвонить Наконец, спросите себя: почему это бесплатно?
Наконец, спросите себя: почему это бесплатно? В лучшем случае это потому, что сервис пронизан рекламой. В худшем случае провайдер крадет ваше соединение и использует вашу пропускную способность для других пользователей. Итог: бесплатный VPN лучше, чем отсутствие VPN. Но если у вас есть деньги и вы цените свою безопасность, инвестируйте в самую высокооплачиваемую подписку. ExpressVPN - одна из лучших премиальных VPN Тогда почему вы видите это во многих аккордовых словарях, которые постоянно используются гитаристом?
Тогда почему вы видите это во многих аккордовых словарях, которые постоянно используются гитаристом? Потому что большинству людей играть легче, чем двум другим возможностям. Начинающие гитаристы имеют тенденцию максимально избегать мизинца. Это может быть ты? May Они могут попробовать комбинацию 2-го, 3-го и 4-го пальцев и сразу же сдаться, потому что вначале они чувствуют себя более неловко. Так что это краткосрочная легкость против долгосрочной эффективности Почему я так точно это записываю?
Почему я так точно это записываю? Среди модов также есть несколько паршивых овец, которые не являются модами Minecraft, а являются вредоносными или рекламными программами. Поэтому всегда загружайте только те моды, которые действительно являются модами. Также при загрузке следует избегать сайтов, которые наполняют вас рекламой. Если вы загружаете файлы на Android с помощью Chrome, мало что может произойти.
Почему это происходит?
Так зачем проходить борьбу с асинхронным кодом?
Записывать 360 ° фильмы на смартфоне Android?
Почему кот мочится на кровать ?
Вы чистите это так часто, как можете, но этот, несмотря на это, пописает в вашу кровать?
Так почему кот мочится на кровать?
Почему 64-разрядные операционные системы не могут запускать 16-разрядные приложения?
Почему 64-разрядные операционные системы не могут запускать 16-разрядные приложения?
Почему ваш 64-битный компьютер не может запускать ваши старые 16-битные приложения?
Вы чистите это так часто, как можете, но этот, несмотря на это, пописает в вашу кровать?