JavaScript

JavaScript, зачем нужен второй await в данном примере

Const imgContainer = document.querySelector('.images');
async function showAvatar() {
let githubResponse = await fetch(`[URL юзера в API github, не пропускает антиспам] `);
let githubUser = await githubResponse.json();

let img = document.createElement('img');
img.src = githubUser.avatar_url;
img.className = 'promise-avatar-example';
document.body.append(img);

await new Promise((resolve, reject) => setTimeout(resolve, 3000));
img.remove();
return githubUser;
}

showAvatar();

Код выше просто показывает аватарку пользователя на гитхабе, я только начал учить JS и был бы рад, если бы подсказали, почему код не работает, если из
let githubResponse = await fetch(`[URL юзера в API github, не пропускает антиспам] `);
let githubUser = await githubResponse.json();

сделать вот это ( т. е. убрать второй await )
let githubResponse = await fetch(`[URL юзера в API github, не пропускает антиспам] `);
let githubUser = githubResponse.json();
Какую функцию он выполняет? Первый Await же останавливает работу этой функции, пока не будет выполнена загрузка. А что делает второй await?

Буду очень благодарен за адекватный ответ.
Если некая функция возвращает Promise, то работать с ним ты можешь либо при помощи then, либо при помощи await.
someFunctionReturnsPromise().then(result => {

});

Или await. Иначе с Promise-объектами не поработаешь.
Что он делает? Тоже какую-то асинхронную задачу. Возможно, ожидает ещё данных запроса.
Юлий Мартынов
Юлий Мартынов
53 215
Лучший ответ
В этом случае:
let githubResponse = await fetch(`[URL юзера в API github, не пропускает антиспам] `);
let githubUser = githubResponse.json();
выполняется сначала вторая строка, а потом первая. Именно так - сначала выполняется синхронный код, потом асинхронный (промисы и таймеры).
Для понимания, как работают асинхронные функции в JS, почитай про цикл событий - микро- и макрозадачи. И еще раз пройдись по промисам и fetch.
И писать второй await не совсем корректно. Как написал Максим, лучше использовать .then () - он выполнится после того, как выполнится промис (т. е. в твоем случае запрос по какому-то URL)
Elzhan Sergaliev
Elzhan Sergaliev
3 807
Манч Манч Вторая строка не выполнится, т. к. стоит await. Это новое ключевое слово языка, чтобы не писать громоздкие конструкции с .then()
Когда ты вызываешь fetch, ты ждешь ответ от сервера. Поэтому он асинхронный, т. е. твой код может выполняться дальше и делать полезные вещи, пока ждешь. Когда ты получил ответ от сервера, у тебя есть только заголовки и поток с содержимым, откуда еще придется твой json считать.
Это как если ты бы ждал доставки, машина приехала, его нужно ещё разгрузить и ты снова ждешь.
У видео, например, поток может не закрываться очень долго. Как читаются такие большие ответы можешь посмотреть тут https://learn.javascript.ru/fetch-progress
Владимир Тарабаев Шикарная аналогия, спасибо