Что такое асинхронная функция:
Это функция, которая возвращает объект AsyncFunction, аналогично Promises.Если он выдает ошибку, объект отклоняет, в противном случае, когда он возвращает значение, он разрешается.
Асинхронные функции новее, и до того, как они существовали, были разные способы написания асинхронного кода: Promises (часть rxjs),Observables («бесконечные обещания»), обратные вызовы, используемые с событиями синхронизации.
Что такое ключевое слово await:
В Javascript ключевое слово await
может использоваться только внутриasync
Функция со следующим синтаксисом:
[returnValue] = await expression;
Где выражение может быть Promise или любым другим значением, возвращаемым асинхронным кодом.
await
приказывает коду остановиться и ждать этого значения.
Без этого returnValue
в вышеприведенном выражении будет немедленно дано значение (скорее всего, undefined), и код продолжит работу без блокировки.Через некоторое неизвестное время и неизвестную точку в коде функция, наконец, вернется, и returnValue
наконец получит правильное значение.Но, возможно, код пошел вперед и ошибочно предположил, что у вас уже есть определенное и обновленное значение, возможно, оно не удалось.
Попробуйте запустить фрагменты без асинхронного ожидания.Это примеры счетчиков, показывающие соответствующий синхронный код:
ПРИМЕР 1: все Обещания запускаются немедленно
function LogAll() {
console.log("One: Started");
new Promise((resolve, reject) => {
setTimeout(function() {
console.log("One: Completed");
resolve();
}, 1000);
});
console.log("Two: Started");
new Promise((resolve, reject) => {
setTimeout(function() {
console.log("Two: Completed");
resolve();
}, 2000);
});
console.log("Three: Started");
new Promise((resolve, reject) => {
setTimeout(function() {
console.log("Three: Completed");
resolve();
}, 3000);
});
}
LogAll();
ПРИМЕР 2: Никаких обещаний вообще (результаты, аналогичные примеру 1)
function LogAll() {
console.log("One: Started");
setTimeout(function() {
console.log("One: Completed");
}, 1000);
console.log("Two: Started");
setTimeout(function() {
console.log("Two: Completed");
}, 2000);
console.log("Three: Started");
setTimeout(function() {
console.log("Three: Completed");
}, 3000);
}
LogAll();
В Примере 2 обратите внимание, что setTimeout является событием синхронизации, более старой функцией Javascript, поэтому он действительно не нуждается в обертке Promise, за исключением того, что Promise позволяет бросатьошибки и отклонить.