0

Всем привет. Есть следующий код:

async function func() {
  const response = await fetch('https://jsonplaceholder.typicode.com/users');
  return await response.json();
}
console.log(func()); // успешный промис, результат которого - массив пользователей

Что выполняется внутри func?

  1. fetch возвращает промис.
  2. Промис делает get запрос.
  3. Получает ответ - объект Response.
  4. Потом резолвится этим объектом.
  5. Тем временем, await, перед fetch, ждёт выполнения всех 4 пунктов, чтобы получить результат промиса и отдать этот результат в const response.
  6. Затем мы переводим результат из json-строки в массив - это тоже происходит не сразу, а с определённой задержкой.
  7. Поэтому мы добавляем еще один await, чтобы дождаться и этой операции.
  8. И вот только после того, когда все вышестоящие пункты выполнились, вот тогда и происходит 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.

  • абсолютно то же самое что в предыдущем вопросе. На самом деле выводит Promise вообще без значения, в состоянии Pending просто когда ты раскрываешь его чтобы увидеть детали - Promise уже разрешился и получил значение. – Grundy Jan 21 '22 at 08:17
  • @Grundy Смотри, если выводится промис в Pending, значит вывод в консоль знает, что из ф-ии возвращается промис, который когда-то должен зарезолвиться. Но до этого, у нас еще было обращение к серверу, получение от него ответа и так далее. Как консоль успел дождаться этих операций? Он же их не ждёт, а соответственно нам должен вернуться промис с fulfilled и значением undefined, попробуй сам запустить второй вариант кода. – Marshall Mathers Jan 21 '22 at 08:26
  • консоль ничего не ждет. Promise возвращается сразу, как доходит до await, именно в этот момент происходит вывод в консоль. – Grundy Jan 21 '22 at 08:37
  • @Grundy А вообще, правильно то, что если мы из async функции явно возвращаем промис, то тогда из функции вернётся этот самый явный промис, а не тот, который async функция возвращает неявно? – Marshall Mathers Jan 21 '22 at 13:17
  • не понял вопрос. – Grundy Jan 21 '22 at 13:18

0 Answers0