Что такое fetch
Fetch API - это интерфейс JavaScript для работы с запросами и ответами HTTP. Если ранее подобный функционал можно было достигнуть, использую XMLHttpRequest, то сейчас Fetch API использует promises. Т.е., используя метод fetch
, мы можем рендерить нужную нам информацию на фронтенде.
Функция fetch принимает два параметра:
url
— адрес, по которому нужно сделать запросoptions
(необязательный) — объект конфигурации, в котором можно настроить метод запроса, тело запроса, заголовки и многое другое
По умолчанию вызов fetch делает GET-запрос по указанному адресу. Базовый вызов для получения данных можно записать таким образом:
fetch("http://jsonplaceholder.typicode.com/posts")
Результатом вызова fetch
будет Promise
, в котором будет содержаться специальный объект ответа Response
.
Promise простыми словами
Представим обычную ситуацию между двумя людьми. Например, жена готовит оливье на Новый год и не хватает ингредиентов. Отправляет мужа Promise в магазин.
Жена: Promise
, сходи, пожалуйста, в магазин и принеси мне горошек (itemA) для оливье!
Promise: Да, конечно! Без проблем!
Жена: Пока ты ходишь в магазин, я подготовлю другие ингредиенты itemB (асинхронная операция). Только скажи, нашел ли ты горошек itemA (возвращаемое промисом значение).
Promise: А если ты будешь у соседки и тебя не будет дома, когда я вернусь?
Жена: Тогда напиши мне, что ты вернулся и принес горошек (itemA) (успешный callback). Если ты не найдешь, позвони мне немедленно (неуспешный callback).
Promise: Хорошо, договорились!
Если просто, то promise – это данные, которые возвращает асинхронная функция. Данная функция имеет два статуса: resolve, если функция была успешная, и reject, если функция вернула ошибку, т.е. promise
вернулся с магазина с пустыми руками. Грустная ситуация для жены, но не для нас.
Что давайте рассмотрим пример, когда нам нужно рендерить данные через fetch
Для работы необходима последняя версия Node, установленная на вашем компьютере.
Есть следующая разметка.
<div class="container">
<div class="goods">
<div class="goods__item"></div>
</div>
</div>
1. Для начала создадим функцию. В качестве примера работы fetch будем использовать JSONPlaceholder. Это бесплатный фейковый API для тестирования и прототипирования.
В моем примере в рамках наглядности я буду использовать три модуля. В первом буду получать данные от сервера и сразу же обрабатывать их в формат json для последующей работы.
const getData = () => {
return fetch('https://jsonplaceholder.typicode.com/photos')
.then((response) => {
return response.json()
})
}
export default getData
Здесь уже будем запускать функцию, которая будет обрабатывать ответ от сервера. Это будет модуль launchRender.js. Полученные данные мы уже сможем использовать для рендера товаров. Т.е. сначала получаем данные от сервера и переводим в json, а далее уже обрабатываем их для вывода пользователю.
import getData from './getData'
import renderGoods from './renderGoods'
const launchRender = () => {
getData().then((data) => {
renderGoods(data)
})
}
export default launchRender
Функция для рендера товаров. Здесь находим контейнер для товаров, далее перебирая массив данных через цикл, будем добавлять верстку карточки.
const renderGoods = (goods) => {
const goodsWrapper = document.querySelector('.goods')
goods.forEach((goodsItem) => {
goodsWrapper.insertAdjacentHTML('beforeend', `
<img class='goods__img' src="${goodsItem.url}">
<h3 class="goods__title">${goodsItem.title}</h3>
`)
})
}
export default renderGoods
Таким образом можно получать данные от сервера и обрабатывать их. В Fetch API встроена поддержка самых разных типов данных. Поскольку результат запроса возвращается в объекте Response, то вы можете использовать его методы для автоматической конвертации получаемых данных в нужный тип. На сегодня имеются методы:
Response.text()
Response.json()
Response.formData()
Response.arrayBuffer()
Response.blob()
Fetch API предоставляет упрощенный и в тоже время гибкий и мощный инструмент для обращения к сетевым ресурсам .
Комментарии (13)
Mi11er
19.07.2022 18:16+1Там это, async / await обертку придумали четкую =) чтоб вот эти ваши промисы красиво получать =)
let response = await fetch()
let data = awain response.json()
SolarmanAwm
19.07.2022 19:01-2Async/await для слабоков.
oWeRQ
19.07.2022 20:14+1Async/await не избавляют от необходимости понимать и работать с промисами, думаю для новичков это лишнее, кроме того надо будет еще try/catch попутно объяснять.
Lazytech
19.07.2022 20:03+3Если просто, то promise – это данные, которые возвращает асинхронная функция. Данная функция имеет два статуса: resolve, если функция была успешная, и reject, если функция вернула ошибку, т.е. promise вернулся с магазина с пустыми руками. Грустная ситуация для жены, но не для нас.
Нич-чего не понимаю. (с)
Вроде колбэки у промиса обычно именуют resolve и reject, тогда как статусов может быть три: pending, fulfilled и rejected. Подробнее см. по ссылкам ниже.
https://developer.mozilla.org/ru/docs/Web/JavaScript/Reference/Global_Objects/Promise
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise
https://learn.javascript.ru/promise-basicsПрошу поправить, если я что-то не так понял.
MrRewolwer
19.07.2022 22:33+2Я думал, что часть про жену - это что-то постыдное, но когда увидел как нам предлагают из fetch делать условный innerHTML...
Lazytech
20.07.2022 06:07Касательно применения промисов, колбэков и иже с ними на практике, могу порекомендовать кое-какие видеолекции на русском языке (см. ниже).
Подборка видео по теме "Асинхронное программирование":
https://www.youtube.com/playlist?list=PLHhi8ymDMrQZ0MpTsmi54OkjTbo0cjU1TYouTube-канал "Timur Shemsedinov":
https://www.youtube.com/c/TimurShemsedinov
Lazytech
20.07.2022 06:21Вспомнил про качественные видеолекции на английском языке (см. ниже).
Подборка видео "JavaScript AJAX with fetch":
https://www.youtube.com/playlist?list=PLyuRouwmQCjkWu63mHksI9EA4fN-vwGs7YouTube-канал "Steve Griffith - Prof3ssorSt3v3":
https://www.youtube.com/c/SteveGriffith-Prof3ssorSt3v3
dopusteam
Так как? Не увидел, что fetch рендерил что то
zybailo Автор
Если забросить в песочницу, то увидите данные, которые подтягиваются из jsonplaceholder
Djaler
Намёк был на то, что fetch - это транспорт, никак не связанный с рендерингом.
Andchir
Неужели так сложно поправить заголовок и одно предложение в тексте? Такой контент от школы - очень не красиво смотрится...