Могу задать несколько вопросов по технологии отправки/получения информации с сервера (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). Потому что и там и там все во вполне понятном и читабельном формате объекта.
Также хочу поддерживать связь со знающим человеком, чтобы если что ещё о чем-то спросить. Поэтому оставьте свои контакты (соцсеть), если можно.
Спасибо всем огромное! Часто в самообучении так бывает, что в процессе появляется множество вопросов. Я рад, что могу задать их и получить ответ. Мне это действительно важно!
По порядку.
1. Да, нам нужно его обработать
2. Ну как бы да, нам предстоит обработать второй промис
3. Не нужно возвращать console.log, это не промис, а просто лог результата в консоль, возвращает undefined
1) Я объяснил в прошлом пункте
2) Опять же, console.log никак не влияет на это
...
При использовании fetch он создает и возвращает промис. Это уже внутренняя часть языка, ты не должен акцентировать на ней внимание
...
Так сделано, что нужно обрабатывать несколько промисов. Хз, зачем так сделали)
Спасибо за исчерпывающий ответ! Хотя на счёт внутренней работы языка, как раз в этом мне бы и хотелось разобраться больше всего, ведь поняв, как это работает, мне станет понятно все. Такой уж я человек, хочу до всего докопаться.
3. В процессе создания вопроса пользователь Сервиса обязан: 3.7. Не размещать несколько разнородных вопросов в рамках одного вопроса. Наличие дополнительных вопросов в описании вопроса допускается лишь в том случае, если ответы на эти вопросы непосредственно взаимосвязаны друг с другом и могут рассматриваться как подвопросы одного сложносочиненного вопроса.
// 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 не сам промис преобразует, а тело ответа.
Мои вопросы взаимосвязаны друг с другом и не являются разнородными. Они все объединены темой fetch и ответ на один из них, возможно, сможет помочь догадаться до решения других.
ITemka, обновил ответ, где всё расписал.
Вместо цепочек рассуждений "вызвал эту функцию, а затем эту функцию с таким-то аргументом, а затем эту" лучше бы код прикладывал - вышло бы в 10 раз компактнее.
Василий Банников, сожалею, что не сделал так раньше. Хотел загрузить фото, где все, о чем говорил, пробовал в консоли браузера. Но оно оказалось слишком большим, поэтому не получилось. А на счёт того, что много слов, я старался разобраться в проблеме, параллельно пытаясь понять, в чем именно у меня вопросы. В голове творился полнейший хаос, я цеплялся за малейшие адекватные мысли, которые можно было проанализировать, не говоря уже о том, чтобы интерпретировать это в код. Это сложно и неприятно.
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
})
2) Да, именно это. Хотя в вашем примере, скорее, будет наоборот.
То есть:
// const a содержит result в PromiseResult, потому что нет инструкции return console.log(result) и, соответственно, нужный нам объект с нужной нам информацией по-прежнему остаётся в объекте PromiseResult, так как по моей теории "вытаскивает" нужный нам объект из PromiseResult именно инструкция return, не важно, явная она или нет
const a = promise().then((result) => {
console.log(result)
})
// const b не содержит result в PromiseResult, здесь все комментарии с точностью до наоборот как выше
const b = promise().then((result) => {
return result;
})