Функция ASYNC/aNAIT является частью спецификации ES2017. Цель функций async/a a ждать состоит в том, чтобы упростить поведение с использованием обещаний синхронно. Вы можете создать Async Function, маркируя функцию async :
async function myFn() {
return 5;
}
Когда называется Async функция, она возвращает Обещание Отказ Если ASYNC функция возвращает значение, Обещание будет решен с этим значением:
myFn().then(d => console.log(d)); // -> 5
Вы можете использовать ждать Оператор внутри async Функция для «паузы» функции до Обещание это помечено ждать решается:
async function getUserMessages() {
const userInfo = await userService.getUserInfo(); // function waits here until data comes back
const userMessages = messageService.getMessagesFor(userInfo.id); // now we can use the user id from the first call to get the messages.
return userMessages; // userMessages is promise that will resolve with the list of messages.
}
getUserMessages().then(messages => console.log(messages));
Важно отметить, что, используя механизм Async/a enquav, мы не паузы с нитью JavaScript. Скорее, двигатель JavaScript делает асинхронно выполнение, пока результат не будет решен.
Рассвет гибели
Я уверен, что вы знакомы с вариантом этого типа кода, содержащего много вложенных обратных вызовов:
first(function (d1) {
second(function (d2) {
third(function(d3) {
forth(function (d4) {
console.log(d1 + d2 + d3 + d4);
});
});
});
});
Это происходит, потому что каждая операция опирается на результат предыдущего. Теперь, если каждая функция возвращает обещание, вы можете переписать вышеуказанное:
function all() {
var r1;
var r2;
var r3;
first()
.then(function(d1) {
r1 = d1;
return second();
})
.then(function(d2) {
r2 = d2;
return third();
})
.then(function(d3) {
r3 = d3;
console.log(r1, r2, r3);
});
}
all();
Глядя на то время, когда каждый звонок требует, вы можете сказать, как долго он примет, чтобы увидеть результат журнала:
Сначала (): 1 секундавторой (): 2 секундыВ-третьих (): 3 секунды- Общее время: 1 + 2 + секунды
Список выше состоит в том, чтобы подчеркнуть, что каждое обещание должно быть решено, пока не перейдем к следующему. Вот почему всего займет 6 секунд, чтобы распечатать окончательное сообщение на консоль.
Введите async/ждать
Теперь использую async Функции и ждать Оператор мы можем переписать Все Функция выше:
async function all() {
const r1 = await first(); // wait until the promise that first() returns is resolved
const r2 = await second(); // wait until the promise that second() returns is resolved
const r3 = await third(); // wait until the promise that third() returns is resolved
return [r1, r2, r3];
}
all().then(values => console.log(values));
Пару вещей, чтобы отметить здесь:
-
ВсеФункция отмеченаasync. -
ждатьОператор делает паузуВсеФункция доОбещаниечто его «ожидание» решено - Если функция помечена
async, это вернетОбещаниеОтказ Глядя наВсеФункция, мы возвращаем массив значений. Поэтому, когда мы называемВсе, обещание, которое он возвращается, будет решен с массивом ценностей.
Обработка ошибок
Одним из способов обработки исключений с ASYNC функциями является использование попробовать блокировать:
async function run() {
try {
await f1();
await f2();
await f3();
} catch(e) {
// handle exception
}
}
Существуют и другие способы обрабатывать ошибки с функциями Async/a ждать. Чтобы узнать больше о обработке ошибок, проверить это интересное Блог пост Отказ
Этот пост изначально опубликован автором здесь Отказ Эта версия была отредактирована для ясности и может появиться отличаться от исходного поста.