Асинхронные функции

Асинхронная функция — это ярлык для определения функции, которая возвращает обещание.

Например, следующие определения эквивалентны:

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 функций, нам все равно нужно будет использовать thencallbacks:

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))