#15 async/await

#15 async/await

- 6 mins

Фух, ну и быстро же несется время. Ковыряясь с асинхронностью и повторяя некоторые старые темы, порой забываешь, что уже настал день, когда нужно писать новую запись в блог. “Ну ничего” - подумал я, и делая очередную порцию горячих бутербродов :custard:, стал думать о том, что же успел изучить за этот небольшой период времени. На самом деле, не так много как хотелось бы - тема асинхронности дается совсем не легко и часто приходится возвращаться к уже пройденному материалу, чтобы подсмотреть что-то для решения очередной задачи. Поэтому сегодня будут лишь небольшие восторженные отзывы о генераторах, библиотеке ‘со’ и async/await.


Оказывается, генераторы могут не только производить данные, но и принимать их (coroutines). Этим функционалом достигается возможность написание более “плоского” асинхронного кода. Для этого можно использовать библиотеку ‘co’ которая в своей работе применяет генераторы, насколько я понял, она работает примерно так:

Аргументом функции ‘co’ принимается генератор в котором каждый yield это Promise. Функция проходится (циклом или рекурсией) по этому генератору, накладывая обработчик на каждый возвращенный Promise и через этот же обработчик возвращает значение из resolve/reject назад в генератор через next(value). Ну и потом, в самом конце генератора, когда происходит необходимое нам вычисление (например получение массива url), это значение оборачивается в Promise и возвращается.

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

P.S. Если я неверно что-то сказал, то пожалуйста, исправьте в комментах. А то уже было пару крайне одиозных личностей, которые спамили мне в личные сообщения и объясняли какой я плохой человек, ввожу людей в заблуждение. Напоминаю им, что это блог человека ничего не понимающего в программировании, лишь начавшего осваивать эту профессию, описывая процесс своего обучения.

async/await Схожим образом как и библиотека ‘co’ работает async/await, только с чуть более удобным интерфейсом, (как-никак 2015 год на дворе был):

function resolveAfter2Seconds(x) {
  return new Promise(resolve => {
    setTimeout(() => {
      resolve(x);
    }, 2000);
  });
}

async function add1(x) {
  var a = resolveAfter2Seconds(20);
  var b = resolveAfter2Seconds(30);
  return x + await a + await b;
}

add1(10).then(v => {
  console.log(v);  // prints 60 after 2 seconds.

});

async function add2(x) {
  var a = await resolveAfter2Seconds(20);
  var b = await resolveAfter2Seconds(30);
  return x + a + b;
}

add2(10).then(v => {
  console.log(v);  // prints 60 after 4 seconds.

});

Каждый раз конструкция await ожидает, пока выполнится очередной Promise и только потом возвращает его значение. Стоит заметить что функция async возвращает Promise, поэтому ее саму можно использовать, чтобы продолжить цепочку асинхронных вызовов. Невероятно удобная конструкция, которая в разы сокращает количество кода и улучшает его читаемость, даже как-то обидно, что не застал те хардкорные времена, когда люди обходились без всех этих абстракций и всю работу делали “руками”, ну или по крайней мере использовали и разбирались в более сложных библиотеках чем ‘co’ и async/await.


expressJS

В пятницу-субботу бегло прошелся по теории двух курсов - HTTP Server и Express.js , чтобы хотя иметь представление что это такое. Получил общее представление о роутинге, логировании, REST, сессиях ну и многих других интересных штуках. На этой недели все-таки поподробнее остановлюсь на всех этих новых для меня вещах и попробую изучить все детальнее - возможно это будет непросто.

По правде говоря, вчера ближе к ночи, уставший, с уже слезящимися глазами я сел писать эту запись, и буквально через час просто заснул, дописав ее только сегодня. Поэтому снова получилось небольшое опоздание, надеюсь вы не обидились. В конце этой недели планирую съездить на небольшой буткемп (если это можно так назвать), и совместно с некоторыми людьми попроходит задания на LeetCode или Hexlet, так что ждите новостей =)


{done: false} :eyes:

comments powered by Disqus
rss facebook twitter github youtube mail spotify lastfm instagram linkedin google google-plus pinterest medium vimeo stackoverflow reddit quora quora