Всем привет. Есть следующий код:
async function func() {
const response = await fetch('https://jsonplaceholder.typicode.com/users');
return await response.json();
}
console.log(func()); // успешный промис, результат которого - массив пользователей
Что выполняется внутри func?
fetchвозвращает промис.- Промис делает get запрос.
- Получает ответ - объект
Response. - Потом резолвится этим объектом.
- Тем временем,
await, передfetch, ждёт выполнения всех 4 пунктов, чтобы получить результат промиса и отдать этот результат вconst response. - Затем мы переводим результат из json-строки в массив - это тоже происходит не сразу, а с определённой задержкой.
- Поэтому мы добавляем еще один
await, чтобы дождаться и этой операции. - И вот только после того, когда все вышестоящие пункты выполнились, вот тогда и происходит return из func.
Но! Вывод в консоль - это синхронный код, а значит не ждёт выполнения всех пунктов (асинхронных операций). По сути для вывода в консоль тело func должно быть таким:
async function func() {
const response = undefined; // undefined, потому что синхронный код не ждёт, когда придет ответ от сервера, он тупо идет дальше...
return undefined; // тут тоже возвращается undefined, потому что вывод не ждёт выполнения - await response.json()
}
console.log(func()); успешный промис с результатом undefined
И вот сам вопрос - почему выводится промис, результат которого массив? Почему не выводится промис с результатом undefined? То есть получается вывод в консоль успевает дождаться всех операций у func, верно?
Ремарка: я знаю, что async возвращает промис и резолвит его со значением, которое идёт после return (если после return идет промис, то возвращается он). А если у функции нет конкретного возвращаемого значения или вообще, её тело пустое, то вернётся успешный промис с результатом undefined.
Pendingпросто когда ты раскрываешь его чтобы увидеть детали - Promise уже разрешился и получил значение. – Grundy Jan 21 '22 at 08:17Pending, значит вывод в консоль знает, что из ф-ии возвращается промис, который когда-то должен зарезолвиться. Но до этого, у нас еще было обращение к серверу, получение от него ответа и так далее. Как консоль успел дождаться этих операций? Он же их не ждёт, а соответственно нам должен вернуться промис сfulfilledи значением undefined, попробуй сам запустить второй вариант кода. – Marshall Mathers Jan 21 '22 at 08:26await, именно в этот момент происходит вывод в консоль. – Grundy Jan 21 '22 at 08:37