Введение в 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.
-
- Михаил Русаков
Комментарии (0):
Для добавления комментариев надо войти в систему.
Если Вы ещё не зарегистрированы на сайте, то сначала зарегистрируйтесь.