# Async Function (ES2017)

# Объявление

// Стрелочная
const foo = async () => {
    const a = await AsyncFunction();
};
// Обычная
async function foo() {
    const a = await AsyncFunction();  
}
// Стрелочная
(async () => {
    const a = await AsyncFunction();
})()
// Обычная
(async function() {
    const a = await AsyncFunction();
})();

# Описание

  • Async Function - асинхронная функция (Promise + Generator)
  • Асинхронная функция возвращает Promise, для получения значения используется then
  • await дожидается выполнения Promise, вытаскивает значение и возвращает его
  • await можно использовать только внутри асинхронной функции
  • await необязательно ставить перед вызовом асинхронной фунцкии. это может быть любая функция, возвращающая Promise

# Примеры

// AJAX-запрос
const getResource = async (url) => {
    const res = await fetch(url);
    return await res.json();
}

getResource('https://swapi.co/api/people/1/')
    .then(body => console.log(body))
// Асинхронная функция
async function getUser(id) {
    return { id:1 };   
}

async function main() {
    let user = await getUser(1);
    console.log(user);
}

main();

# Использование в классах и объектах

// Свойство объекта
const obj = {
    getUser: async function(id) {
        //
    }
}
// Метод объекта
const obj = {
    async getName() {
        return fetch('https://www.example.com');
    }
}
// Класс
class Obj {
    async getResource() {
        return fetch('https://www.example.com');
    }
}