@ITemka

Могу задать несколько вопросов по технологии отправки/получения информации с сервера (fetch)?

Я изучаю JavaScript. Столкнулся с темой запросов на сервер с помощью технологии fetch. Очень много пытался разобраться, но в итоге я скорее просто заучил, как все работает, а понимания у меня нет. Поэтому прошу ответить на несколько вопросов. Человеку, который в этом разбирается, делать нечего на них ответить, я и сам вижу, что они не сложные. Но ответить на них сам я не могу, тем не менее.

1. Если:
1) Просто вызвать fetch и аргументом передать ссылку;
То:
Выдастся Promise без нужного нам ответа от сервера.

2. Если:
1) Вызвать fetch и аргументом передать ссылку;
2) Вызвать метод then и передать в качестве аргумента колбэк-функцию, а в ней самой написать response.json() и вернуть это
То:
Выдастся Promise с нужным нам ответом от сервера, который будет находится во вложенном объекте PromiseResult.

3. Если:
1) Вызвать fetch и аргументом передать ссылку;
2) Вызвать метод then и передать в качестве аргумента колбэк-функцию, а в ней написать response.json() и вернуть это;
3) Вызвать ещё метод then и там написать console.log(json) и вернуть это (не важно, можно даже не возвращать, а просто написать console.log());
То:
Выдастся Promise с уже пустым объектом PromiseResult и отдельно уже с чистым нужным нам объектом, который раньше был как раз-таки в том самом объекте PromiseResult.

1) Почему здесь не играет роли - возвращать console.log(json) или нет. Ведь и в том и другом случае нам вернётся чистый нужный нам объект с нужной нам информацией.
2) Почему, чистый нужный нам объект с нужной нам информацией отдельно возвращается только тогда, когда пишется console.log(json). И именно после того, как чистый нужный нам объект с нужной нам информацией отдельно возвращается, объект PromiseResult становится пустым. Почему в нем по-прежнему не остаётся чистого нужного нам объекта с нужной нам информацией? Как console.log(json) так сильно влияет на это?

При использовании, fetch автоматически создаёт промис. Но как он это делает? Вот так?
const fetch = new Promise("")
Или он работает как-то по-другому?

Говорится, что метод .json() позволяет конвертировать промис в JSON-формат. Но я не вижу разницы между тем, чтобы просто вызвать fetch и аргументом передать ссылку, и тем, чтобы вызвать fetch и аргументом передать ссылку, вызвать метод then и передать в качестве аргумента колбэк-функцию, а в ней написать response.json() и вернуть это, вызвать ещё метод then и там написать console.log(json). Потому что и там и там все во вполне понятном и читабельном формате объекта.

Также хочу поддерживать связь со знающим человеком, чтобы если что ещё о чем-то спросить. Поэтому оставьте свои контакты (соцсеть), если можно.

Заранее спасибо!
  • Вопрос задан
  • 170 просмотров
Решения вопроса 2
Anopeng
@Anopeng
Веб-программист, учу фронт и бек
https://learn.javascript.ru/async
https://learn.javascript.ru/network

По порядку.
1. Да, нам нужно его обработать
2. Ну как бы да, нам предстоит обработать второй промис
3. Не нужно возвращать console.log, это не промис, а просто лог результата в консоль, возвращает undefined
1) Я объяснил в прошлом пункте
2) Опять же, console.log никак не влияет на это
...
При использовании fetch он создает и возвращает промис. Это уже внутренняя часть языка, ты не должен акцентировать на ней внимание
...
Так сделано, что нужно обрабатывать несколько промисов. Хз, зачем так сделали)

Контакты в профиле
Ответ написан
vabka
@vabka
Токсичный шарпист
Нет, не можешь.

https://qna.habr.com/help/rules

3. В процессе создания вопроса пользователь Сервиса обязан:
3.7. Не размещать несколько разнородных вопросов в рамках одного вопроса. Наличие дополнительных вопросов в описании вопроса допускается лишь в том случае, если ответы на эти вопросы непосредственно взаимосвязаны друг с другом и могут рассматриваться как подвопросы одного сложносочиненного вопроса.

На все вопросы можно ответить "RTFM", приложив две ссылки:
https://developer.mozilla.org/ru/docs/Web/API/Fetc...
https://developer.mozilla.org/ru/docs/Web/JavaScri...
И твой вопрос лучше было бы задавать в виде кода, ибо:
// 1 fetch возвращает промис, который представляет ответ от сервера
const promiseWithResponse = fetch("https://example.com");
// 2 response.json() возвращает промис, который представляет спарсеный json
const promiseWithJson = promiseWithResponse.then(response => response.json());
// 3. console.log возвращает undefined и логирует переданный объект
const emptyPromise = responseWithJson.then(json => console.log(json));


1) Почему здесь не играет роли - возвращать console.log(json) или нет. Ведь и в том и другом случае нам вернётся чистый нужный нам объект с нужной нам информацией.

Хз как у тебя так получилось. console.log возвращает Undefined, а по тому после него ничего в промисе не будет.
Дай пример своего кода.
При использовании, fetch автоматически создаёт промис. Но как он это делает? Вот так?
const fetch = new Promise("")
Или он работает как-то по-другому?

Ну там где-то внутри fetch создаётся Promise и возвращается. Как именно - фиг знает. Это может быть и на плюсах реализовано, в теории.

Говорится, что метод .json() позволяет конвертировать промис в JSON-формат. Но я не вижу разницы между тем, чтобы просто вызвать fetch и аргументом передать ссылку, и тем, чтобы вызвать fetch и аргументом передать ссылку, вызвать метод then и передать в качестве аргумента колбэк-функцию, а в ней написать response.json() и вернуть это, вызвать ещё метод then и там написать console.log(json). Потому что и там и там все во вполне понятном и читабельном формате объекта.


Это тебе так только кажется из-за того что ты все свои варианты в developer console проверяешь.
И .json не сам промис преобразует, а тело ответа.
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
@wonderingpeanut
1) console.log() возвращает undefined. Если функция ничего не возвращает явно, то неявно возвращается undefined. Поэтому нет разницы, возвращать console.log(json) или нет.
2) Не совсем понял. Имеешь в виду это?

// const a не содержит result в PromiseResult
const a = promise().then((result) => {
  console.log(result)
})
// const b содержит result в PromiseResult
const b = promise().then((result) => {
  return result;
})

Насчет фетча, фетч реализован с помощью конструктора XMLHttpRequest.
const fetch = (url) => new Promise((resolve, reject) => {
  // тут создается новый инстанс XMLHttpRequest и через него происходит запрос на сервер
  // подробнее тут https://developer.mozilla.org/ru/docs/Web/Guide/AJAX/Getting_Started
  // пример реализации fetch можно посмотреть здесь https://github.com/github/fetch/blob/master/fetch.js#L506
})
Ответ написан
Ваш ответ на вопрос

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

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