Для получения данных из любого источника мы традиционно используем http, где мы отправляем простой HTTP-запрос на получение данных и визуализируем их после получения ответа. Это хороший подход, но для длинного фрагмента данных нам нужно дождаться ответа API, чтобы нарисовать нашу страницу.

Например, если какой-либо API занимает 5 секунд, чтобы ответить, нам нужно подождать целых 5 секунд, чтобы показать что-то на странице. Как правило, это снижает производительность приложения, а также взаимодействие с пользователем. С новыми потоковыми API мы можем смягчить эту проблему.

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

Давайте посмотрим на это в действии, мы собираемся использовать библиотеку fetch-event-source, предоставленную Microsoft, для получения данных в Steam.

import { fetchEventSource } from "@microsoft/fetch-event-source";

Метод fetchEventSource имеет обратные вызовы, которые мы будем использовать для последовательного извлечения фрагментов из бэкэнда и добавления к нашим исходным данным для рисования страницы.

let hostUrl = "http://www.sourceURL.com";
let connected = false;
let headers = {
  ...some sample headers
}
await fetchEventSource(hostUrl, {
    headers: {
      ...headers,
      accept: "text/event-stream",
    },
    openWhenHidden: true,
    onopen(response) {
      if (response && !connected) {
        //dispatch action to redux that connection is established
        // to set initial loader or base variables
        connected = true;
      }
    },
    onmessage(msg) {
      if (msg) {
        if (msg?.event === "response-headers") {
          //Header listener to tell the response header sent by backedn
        } else if (msg?.event === "response") {
          // dispatch event to append data 
        } else if (msg?.event === "error") {
          // dispatch event to reset data in case of error
        }
      }
    },
    onerror(error) {
      if (error) {
        console.log("error", error);
        // dispatch event if any error
        throw error; // rethrow to stop the operation
      }
    },
    onclose() {
      // dispatch event that connection is closed and complete data is received
    },

С помощью обратного вызова onmessage мы можем последовательно добавлять наши данные и поэтапно рисовать нашу страницу. Это сделает нашу страницу очень удобной для пользователя, и пользователь сможет видеть контент на экране, в то время как другая часть страницы фактически загружается.

Это все, что касается потокового API, который мы можем рассматривать как хорошую альтернативу обычному http-запросу, который мы традиционно используем для наших повседневных операций. Не стесняйтесь давать предложения или задавать любые вопросы.