Главная->Уроки по js->Введение в Async/Await в JavaScript
Введение в Async/Await в JavaScript
Многие программисты находятся в отношениях любви-ненависти с JavaScript. Одной из причиной этого является то, что сам язык пал жертвой одного из своих самых лучших качеств: его легко выучить, но трудно охватить все аспекты. Доказательством этому служит огромное количество заблуждений относительно тех или иных свойств языка: человек думает что, вот эта штука работает так, тогда как на самом деле все наоборот. И в JavaScript такое сплошь и рядом. Вот, например, множество заблуждений относительно классов в JavaScript. JavaScript не имеет настоящих классов, все что мы называем классами и что имеет вид классов - на самом деле это все Прототипы - объекты, от которых наследуются другие объекты. Поэтому, это означает, что "классы" в JavaScript не ведут себя в точности также как и обычные классы. Если класс - это своего рода чертеж, на основе которого создается объект, то прототип - это объект, которому другие объекты делегируют некую работу. Т.е. прототип - это не чертеж, - это реально существующий объект. Вот именно поэтому, существует возможность добавления нового метода в объект Array, после чего у всех объектов данного типа появится этот метод, прямо во-время исполнения. var someArray = [1, 2, 3]; Array.prototype.Lalala = function() { console.log('Ла-ла-ла; Новый метод'); }; someArray.Lalala(); // Ла-ла-ла; Новый метод // Код выше не будет работать с реальными классами, так как изменение описания класса не влияет на сами объекты Короче говоря,классы в JavaScript - это синтаксический сахар для Прототипного наследования. Таким образом, моя главная цель в этих и следующих статьях дать вам понимание того, как работает язык в действительности. И это важно, в том случае, если вы хотите как можно полнее понять язык JavaScript. Спецификация Async/Await Данные парные конструкции делают попытку решить одну из крупнейших проблем языка, с самого начала его существования: асинхронность. На протяжении многих лет, при работе с асинхронным кодом лет мы полагались на Callback-функции: setTimeout(function() { console.log('Потом, около 13 млрд. лет назад произошел большой взрыв'); }, 5000); console.log('Сначала была тьма'); Callback-функции прекрасно решают задачу, до тех пор пока не появляется потребность выполнить последовательность асинхронных операций: doThingOne(function() { doThingTwo(function() { doThingThree(function() { doThingFour(function() { // раз два три }); }); }); }); Такая конструкция понятна компьютеру, но сложна для человека, который вынужден разбирать эти вложенные уровни. И вот тут-то на сцену выходят Промисы - JavaScript Обещания. Смотрите: обещания Промисы - очень прагматичный путь работы с асинхронным кодом. Представляют собой они объекты, реализующие некую асинхронную задачу, которая выполниться либо через секунду, либо через минуту, либо... function buyCoffee() { return new Promise((resolve, reject) => { asyncronouslyGetCoffee(function(coffee) { resolve(coffee); }); }); } Функция buyCoffee возвращает объект Promise, представляющий процесс приобретения кофе. А функция resolve сигнализирует успешное завершение, оно получает в качестве аргумента значение, которое затем может быть использовано далее. Объект Promise имеет два основных метода: then: запускает callback-функцию, обрабатывающую результат catch: вызывает callback-функцию, обрабатывающую ошибки Также у объекта Promise есть другие интересные свойства, которые позволяют создавать цепочки вызовов. buyCoffee() .then(function() { return drinkCoffee(); }) .then(function() { return doWork(); }) .then(function() { return getTired(); }) .then(function() { return goToSleep(); }) .then(function() { return wakeUp(); }); Как видите, этот листинг выглядит намного лучше, чем тот который был бы написан с помощью callback-функций. Таким образом в данной статье мы поговорили о том, что стоит за асинхронными операциями в JavaScript, а в следующей статье мы непосредственно познакомимся с ключевыми словами async/await в JavaScript.