Что такое 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
  1. Здесь уже будем запускать функцию, которая будет обрабатывать ответ от сервера. Это будет модуль launchRender.js. Полученные данные мы уже сможем использовать для рендера товаров. Т.е. сначала получаем данные от сервера и переводим в json, а далее уже обрабатываем их для вывода пользователю.

import getData from './getData'
import renderGoods from './renderGoods'

const launchRender = () => {
	getData().then((data) => {
  	renderGoods(data)
  })
}

export default launchRender
  1. Функция для рендера товаров. Здесь находим контейнер для товаров, далее перебирая массив данных через цикл, будем добавлять верстку карточки.

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)


  1. dopusteam
    19.07.2022 17:49
    +5

    Как рендерить данные через fetch

    Так как? Не увидел, что fetch рендерил что то


    1. zybailo Автор
      19.07.2022 18:08
      -3

      Если забросить в песочницу, то увидите данные, которые подтягиваются из jsonplaceholder


      1. Djaler
        19.07.2022 18:49
        +6

        Намёк был на то, что fetch - это транспорт, никак не связанный с рендерингом.


      1. Andchir
        19.07.2022 21:09

        Неужели так сложно поправить заголовок и одно предложение в тексте? Такой контент от школы - очень не красиво смотрится...


  1. Mi11er
    19.07.2022 18:16
    +1

    Там это, async / await обертку придумали четкую =) чтоб вот эти ваши промисы красиво получать =)

    let response = await fetch()

    let data = awain response.json()


  1. SolarmanAwm
    19.07.2022 19:01
    -2

    Async/await для слабоков.


    1. un1t
      19.07.2022 19:27
      +1

      Промисы тоже, настоящие мужики используют callback'и)


      1. nin-jin
        19.07.2022 19:40
        +2

        Олды используют синхронный XmlHTTPRequst.


    1. oWeRQ
      19.07.2022 20:14
      +1

      Async/await не избавляют от необходимости понимать и работать с промисами, думаю для новичков это лишнее, кроме того надо будет еще try/catch попутно объяснять.


  1. 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

    Прошу поправить, если я что-то не так понял.


  1. MrRewolwer
    19.07.2022 22:33
    +2

    Я думал, что часть про жену - это что-то постыдное, но когда увидел как нам предлагают из fetch делать условный innerHTML...


  1. Lazytech
    20.07.2022 06:07

    Касательно применения промисов, колбэков и иже с ними на практике, могу порекомендовать кое-какие видеолекции на русском языке (см. ниже).

    Подборка видео по теме "Асинхронное программирование":
    https://www.youtube.com/playlist?list=PLHhi8ymDMrQZ0MpTsmi54OkjTbo0cjU1T

    YouTube-канал "Timur Shemsedinov":
    https://www.youtube.com/c/TimurShemsedinov


  1. Lazytech
    20.07.2022 06:21

    Вспомнил про качественные видеолекции на английском языке (см. ниже).

    Подборка видео "JavaScript AJAX with fetch":
    https://www.youtube.com/playlist?list=PLyuRouwmQCjkWu63mHksI9EA4fN-vwGs7

    YouTube-канал "Steve Griffith - Prof3ssorSt3v3":
    https://www.youtube.com/c/SteveGriffith-Prof3ssorSt3v3