Рубрики
Без рубрики

Как легко отменить пользовательские вызовы HTTP с RXJS

Теперь, когда реагирующие крюки были официально выпущены, появляются еще больше шаблонов по всему интернету. Use Expectect Крюксектов среди самых популярных, так как он может заменить компонентDIDMount, ComponentDidupdate и ComponentWillunmount. Большая часть инициализации, обновлений и логики очистки компонент может понадобиться внутри

Теперь, когда Реактивные крюки Были официально выпущены, даже больше шаблонов появляются через Интернет.

useffect.

Useffect Крюк среди самых популярных, так как он может заменить ComponentDidmount. , ComponentDidupdate , а также ComponentWillunmount Отказ

Большая часть инициализации, обновлений и логики очистки компонент может понадобиться, может быть поставлен внутри Useffect Отказ

Уродливый пользовательский опыт

На недавнем проекте я столкнулся с сценарием, где Useffect Вы действовал на HTTP-запросы, которые я больше не был заинтересован.

Концептуально интернет-интерфейс был таким:

  • На первой нагрузке, извлеките список фруктов и визуализируйте <кнопка> для каждого.
  • Нажмите на <кнопка> чтобы получить детали фруктов.

Но посмотрите, что происходит, когда я нажимаю несколько фруктов подряд

Способ после перестала щелкнуться, раздел детали фруктов продолжал меняться!

Код

Давайте посмотрим мой пользовательский крючок, который использует Useffect Отказ

Вот …| CodeSandbox и Гадость Ссылки, если вы хотите следовать. Файл это UseFruitDetail.js Отказ

import { useEffect, useState } from 'react';
import { getFruit } from './api';

export const useFruitDetail = (fruitName) => {
  const [fruitDetail, setFruitDetail] = useState(null);

  useEffect(() => {
    if (!fruitName) {
      return;
    }

    getFruit(fruitName).then(setFruitDetail);
  }, [fruitName]);

  return fruitDetail;
};

Всякий раз, когда Прута Изменения, мы запросим его детали. И у нас нет способа отмены запроса! Так быстро повторно запустите это результаты во многих изменениях, которые мы больше не заинтересованы.

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

Введите RXJS.

Игнорирование старых запросов тривиально с RXJS.

Это может сделать намного больше, чем то, что я буду здесь, поэтому я настоятельно рекомендую вам погрузиться в него !

Эта часть нашего кода, эффект код, должен изменить.

() => {
  if (!fruitName) {
    return;
  }

  getFruit(fruitName).then(setFruitDetail);
};

Вместо обещания давайте преобразом Getfruit в наблюдаемый с использованием RXJS отложить функция. И вместо .then мы позвоним . Подписаться Отказ

import { defer } from 'rxjs';

// ...

() => {
  if (!fruitName) {
    return;
  }

  defer(() => getFruit(fruitName)).subscribe(setFruitDetail);
};

Это еще не решает проблему. Нам до сих пор надо отписаться Если Прута изменения.

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

Так что-то вроде этого:

() => {
  if (!fruitName) {
    return;
  }

  const subscription = defer(() => getFruit(fruitName)).subscribe(
    setFruitDetail
  );

  return () => {
    subscription.unsubscribe();
  };
};

Оно работает!

Этот опыт гораздо чище!

Нажав на другой фрукт, Useffect видит Прута Измените и управляет логикой очистки предыдущего эффекта. В результате мы отписываем от предыдущей вызова приема и сосредоточиться на текущем.

Теперь наш интерфейс терпеливо ждет, пока пользователь не нажал на клипс, а данные о новейших фруктах возвращаются.

Спасибо, что после этого урока до конца!

Оригинал: “https://www.freecodecamp.org/news/how-to-easily-cancel-useeffect-http-calls-with-rxjs-d1be418014e8/”