Функция 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 ждать. Чтобы узнать больше о обработке ошибок, проверить это интересное Блог пост Отказ
Этот пост изначально опубликован автором здесь Отказ Эта версия была отредактирована для ясности и может появиться отличаться от исходного поста.