Могу задать несколько вопросов по технологии отправки/получения информации с сервера (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) 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;
})