…
Асинхронные функции
Асинхронная функция — это ярлык для определения функции, которая возвращает обещание.
Например, следующие определения эквивалентны:
function f() { return Promise.resolve('TEST'); } // asyncF is equivalent to f! async function asyncF() { return 'TEST'; }
Точно так же асинхронные функции, которые выдают исключения, эквивалентны функциям, которые возвращают отклонение промисов:
function f() { return Promise.reject('Error'); } // asyncF is equivalent to f! async function asyncF() { throw 'Error'; }
Ждите
Чтобы синхронизировать промисы, нам нужно позволить им ждать друг друга. Другими словами, если операция является асинхронной (т. е. инкапсулирована в обещание), она должна иметь возможность дождаться завершения другой асинхронной операции. Но как интерпретатору JavaScript узнать, выполняется ли операция внутри промиса или нет?
Ответ находится в ключевом слове async
. Каждая функция async
возвращает обещание. Таким образом, интерпретатор JavaScript знает, что все операции в async
функциях будут инкапсулированы в промисы и выполняться асинхронно. Следовательно, это может позволить им дождаться завершения других промисов.
Введите ключевое слово await
. Его можно использовать только в async
функциях, и он позволяет нам синхронно ожидать обещания. Если мы используем обещания вне async
функций, нам все равно нужно будет использовать then
callbacks:
async function f(){ // response will evaluate as the resolved value of the promise const response = await rp('http://example.com/'); console.log(response); } // We can't use await outside of async function. // We need to use then callbacks .... f().then(() => console.log('Finished'));
Теперь давайте посмотрим, как мы можем решить задачу из предыдущего раздела:
// Encapsulate the solution in an async function async function solution() { console.log(await rp('http://example.com/')); const call2Promise = rp('http://example.com/'); const call3Promise = rp('http://example.com/'); const response2 = await call2Promise; const response3 = await call3Promise; console.log(response2); console.log(response3); } // Call the async function solution().then(() => console.log('Finished'));
Давайте попробуем это
async function f() { console.log('Starting F'); const result = await fetch('https://jsonplaceholder.typicode.com/todos/1'); console.log(result); }
Обработка ошибок в Async & Await
Используя попытку {} поймать {}
async function f() { try { const promiseResult = await Promise.reject('Error'); } catch (e){ console.log(e); } }
Использование then() catch()
async function f() {
// Throws an exception
const promiseResult = await Promise.reject('Error');
}
// Will print "Error"
f().
then(() => console.log('Success')).
catch(err => console.log(err))
async function g() {
throw "Error";
}
// Will print "Error"
g().
then(() => console.log('Success')).
catch(err => console.log(err))