@anvaslist

Что по итогу возвращают функция fetch() и метод json()?

Всем привет.

1) Есть следующий код, в консоль выводится экземпляр Промиса:
function fn() {
  const result = fetch('https://jsonplaceholder.typicode.com/users');
  console.log(result);
}
fn();

2) Второй вариант кода (добавил async/await), в консоль уже выводится экземпляр объекта Response:
async function fn() {
  const result = await fetch('https://jsonplaceholder.typicode.com/users');
  console.log(result);
}
fn();

3) Третий вариант:
async function fn() {
  const result = await fetch('https://jsonplaceholder.typicode.com/users');
  return result;
}
console.log(fn());

Здесь я уже не вывожу в консоль result, а возвращаю из ф-ии, вот при таком коде снова выводится экземпляр Промиса, у которого [[PromiseResult]] - экземпляр Response. И это при малейших изменениях кода. Отсюда вопрос, так что в конечном итоге возвращает fetch? Экземпляр Response или Promise?
4) Также к результату работы fetch применяется метод json, в консоли Промис:
async function fn() {
  const result = await fetch('https://jsonplaceholder.typicode.com/users');
  const response = result.json();
  console.log(response);
}
fn();

5) А если сделаю вот так (добавил await перед result.json()), то в консоли уже ожидаемый массив:
async function fn() {
  const result = await fetch('https://jsonplaceholder.typicode.com/users');
  const response = await result.json();
  console.log(response);
}
fn();

6) И последний пример. Если опять не вывести в консоль, а вернуть переменную из ф-ии, то снова Промис:
async function fn() {
  const result = await fetch('https://jsonplaceholder.typicode.com/users');
  const response = await result.json();
  return response;
}
console.log(fn());

После прочтения статей и просмотра туториалов, у меня всё равно остался вопрос: что в итоге возвращают функция fetch и метод json? Если fetch возвращает Промис, то как мы тогда к нему применяем метод json? У Промиса же нет этого метода. В общем, спасибо за уделённое время на прочтение вопроса. Буду премного благодарен, если есть возможность объяснить своими словами, я сам ужасно запутался...
  • Вопрос задан
  • 625 просмотров
Решения вопроса 1
MrDecoy
@MrDecoy Куратор тега JavaScript
Верставший фронтендер
а где Вы применяете json непосредственно к fetch?
И fetch и json возвращают промис.
json Вы применяете к данным, которые этот промис возвращает когда резолвится.

fetch().then(response => response.json()) != fetch().json()


То есть fetch делает запрос, возвращает промис.
Когда этот запрос возвращает данные, то промис, который вернул fetch, резолвится по средствам вызова своей внутренней функции resolve(), в аргумент которой передаёт специальный объект, у которого уже есть методы .json, .text и тд.

Скорее всего Вам стоит погрузиться более глубоко в промисы, перечитать что это за объект такой, когда fetch резолвится, ну и что такое по существу async\await и причём тут промисы.

Что касается async функций, то они тоже возвращают промис. Всегда. Независимо от кода внутри.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы