4 способа побороть Race Condition

Поделиться
HTML-код
  • Опубликовано: 29 июн 2024
  • В каждом проекте встречается проблема Race Condition. И из моего опыта многие игнорируют ее, пока уже тестировщик явно не укажет на баг. И сегодня мы рассмотрим 4 способа как всего в пару строк побороть Race Condition
    Разверните мощную облачную базу данных за пару кликов в Selectel: slc.tl/fssx2
    документация useEffect - react.dev/reference/react/use...
    Первая часть видео: • Нет useEffect, нет баг...
    Вторая часть видео: • Как я работаю с deboun...
    ТГ канал - t.me/it_sin9k
    Поддержать Айти Синяка можно здесь:
    RUclips: / @it-sin9k
    boosty: boosty.to/sin9k
    Patreon: / itsin9k
    00:00 Анонс темы
    00:32 Аутсорсинг БД - Selectel
    01:56 Что такое Race Condition?
    02:45 useEffect + AbortController
    03:39 useEffect + ignore
    04:25 ref + AbortController
    05:08 ref + requestIndex
    05:50 А вы испольузете AbortController?
    Подписаться на канал: / @it-sin9k
    Twitter: / it_sin9k

Комментарии • 86

  • @user-ik7rp8qz5g
    @user-ik7rp8qz5g 3 месяца назад +14

    Где-то была статья от автора react query, где он описывает все возможные сложности, которые возникают при самом простом сетевом запросе и сохранении результата в стейт. Если коротко, то race condition там далеко не единственная возможная проблема, и в результате нужна целая стена текста для обработки всех ситуаций. Почему он и сделал эту библиотеку - чтобы делать все это одним хуком вместо стены текста.

    • @it-sin9k
      @it-sin9k  3 месяца назад

      Звучит как крутая статья) почитал бы)

    • @stanislavw9709
      @stanislavw9709 3 месяца назад +2

      Сбросьте ссылку на статью, пожалуйста :)

    • @MikeNugget
      @MikeNugget 3 месяца назад

      Common Patterns and Nuances Using React Query

    • @testtestable8358
      @testtestable8358 2 месяца назад

      фактанул

  • @MrZorg23
    @MrZorg23 2 месяца назад

    Спасибо! Очень полезное видео!

  • @user-is8ov1km3t
    @user-is8ov1km3t 3 месяца назад +3

    А еще есть старое доброе поле ввода без дурацких отвлекающих подсказок, и с отдельной кнопкой поиска (и по enter разумеется). Никаких гонок, никакого дрочения сервера ненужными запросами) Очень раздражает, когда поле ввода пытается за меня решить, что же мне нужно) Такое ощущение, что когда увидели ajax впервые, обрадовались, что не надо отправлять форму и перезагружать страницу, и присобачили его везде где надо и не надо) Это ни в коем случае не наезд на видео, ибо видео как обычно полезное и нужное. Просто высказал мнение по поводу автоподсказок в инпуте - мне они не нравятся со всех точек зрения - пользователя, фронтенд- и бэкенд-разработчика)

  • @boldureans
    @boldureans 3 месяца назад +2

    Саш привет! Спасибо за видео. В react-query, queryFn пробрасывает параметр signal. Так что если у вас уже есть клиентская абстракция над rest типа: post(url, data) => (signal) => {...} то все запросы будут отменяться, это очень удобно для юзеров с медленным интернетом. По умолчанию все запросы доводятся до конца, что иногда слишком, если учитывать что юзер на ту страничку не вернётся и кликнул её случайно. И кстати, наверное new AbortController скорее должен быть один, при той же настройки axios instance. его же можно потом абортить из любой точки.

    • @it-sin9k
      @it-sin9k  3 месяца назад +6

      Про useQuery планирую записать отдельное видео)

    • @alexs7931
      @alexs7931 3 месяца назад

      Главное не отмеить таким образом получение скидки по промокоду , или любое другое действие которое должно 100% прийти обратно клиенту(если конечно стейт не хранится на сервере , тогда купон не пропадет) 🤗
      А кто ведет логи отмены запросов кстати?

    • @boldureans
      @boldureans 3 месяца назад

      @@alexs7931 Клиент, конечно) Так отмена запросов в основном когда происходит внезапный unmount (быстро переключая табы, например). Если запросить промокод и уйти с экрана, то спрашивается нужен ли он на новом?)

  • @nilsen1879
    @nilsen1879 3 месяца назад +1

    Спасибо за видео. Я как раз в предыдущих спрашивал про этот случай. Но мне почему-то кажется, что все является неким костылем и нужно добавлять дополнительный код чтобы логика работала так как надо. К тому же если я хочу просто свою асинхронную операцию как то отменить, а не сетевую, abort controller мне не подойдет. Во общем нужно создавать какой-то свой кастомный враппер, чтобы это хотя бы чистенько выглядело

    • @it-sin9k
      @it-sin9k  3 месяца назад

      т.е. вы хотите отменить асинхронные функции? даже не связанные с запросом? а можно пример?

  • @user-nh8um2dn9s
    @user-nh8um2dn9s 3 месяца назад

    Используем логическую переменную типа "нужно или нет" менять стейт

  • @MrManimarko
    @MrManimarko 3 месяца назад +3

    ну явно лучше если аборт контроллер используется 1-2 раза, а не 100 потому что это копипаста говнокод, и race condition надо решать не на уровне компонента, а выше

  • @archibaldstriebendrossel
    @archibaldstriebendrossel Месяц назад

    У это проблемы две половины. Одна - непредсказуемый порядок получения ответов от сервера. В видео разбираются подходы для решения этой части. Вторая - непредсказуемый порядок получения запросов сервером. Клиент, отправляя сначала запрос А, а потом Б, не может быть уверен, что сервер получит их именно в этом порядке. Например, мы делаем редактор документов аля гугл док. Сохраняем текущую версию документа на сервер раз в секунду. Теперь, что будет если запрос отправленный последним, придёт на сервер предпоследним? На сервере окажется не та версия документа.

  • @oughtlesss6553
    @oughtlesss6553 3 месяца назад

    У нас на проекте есть удобная обёртка для запросов с аборт контроллером, которая используется почти везде. А ещё есть конструкция для проверки имеется ли файл на сервере (суть в том что существует только запрос, который скачивает файл, но нам не нужен сам файл, он очень большой, потому мы просто абортим запрос когда файл начинает скачиваться)

    • @it-sin9k
      @it-sin9k  3 месяца назад

      а почему сервер не может просто сказать, есть файл или нет?)

    • @oughtlesss6553
      @oughtlesss6553 3 месяца назад

      ​@@it-sin9kНет возможности что-то сделать с сервером), а у него настройка всегда на download или что-то тип того. На тот момент я ничего не нашел, чтобы не менять запрос на сервере

  • @tagnati5585
    @tagnati5585 3 месяца назад

    На моем проекте нашлось 4 места где создается инстанс аборт контроллера

  • @user-ms5vu1zp9d
    @user-ms5vu1zp9d 3 месяца назад +1

    Первый и самый очевидный в твоем примере функция дебонс. Как мне кажется) ну и честно к вопросу подходя
    Я не знаю какого качества надо писать код чтобы пришлось юзать аборт контроллеры и тд
    Проблема очевидна всегда. Либо бекенд и медленный серв. Фронт не должен закрывать костылями с абортами бекенд плохоработающий
    Второй криво написан сам фронт - проблема та же. Не надо делать костыли. Нужно делать простой и понятный код.

    • @ihateidiots9484
      @ihateidiots9484 3 месяца назад

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

    • @user-ms5vu1zp9d
      @user-ms5vu1zp9d 3 месяца назад

      @@ihateidiots9484 не должен если у бека руки из попы проблемы его
      Я могу это делать и заглушки в любом случае будут но это не фронта зона ответственности.
      Перевелу стрелки. Очередной говнокодер сеньор с 10 летним опытом? 🙂

    • @it-sin9k
      @it-sin9k  3 месяца назад +1

      а как вы ожидаете должно работь приложение, если нужно отправить 2 подряд запроса с очень маленькой разницей?

    • @user-ms5vu1zp9d
      @user-ms5vu1zp9d 3 месяца назад

      @@it-sin9k можно пример, Саш (:
      Се то не пойму ) есть может редкий кейс где пригодится но он редкий)

    • @user-bg3hu1oz4y
      @user-bg3hu1oz4y 3 месяца назад

      сеньор небось?)

  • @Niachan666
    @Niachan666 2 месяца назад

    Шёл 24 год, а всё базовые вещи разбирают

    • @it-sin9k
      @it-sin9k  2 месяца назад +2

      а что хотелось бы обсудить в 24 году?)

  • @arman-6172
    @arman-6172 Месяц назад

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

    • @it-sin9k
      @it-sin9k  Месяц назад

      я так понял, вы хотите поставить кастомное время на выполнения fetch? насколько я вижу примеры в гугле, в основном только через AbortController + setTimeout

    • @arman-6172
      @arman-6172 Месяц назад

      @@it-sin9k верно. Интересно и серверное и клиент решение

  • @mrstronciy1060
    @mrstronciy1060 3 месяца назад

    Будет обзор React 19? Лень читать )

    • @it-sin9k
      @it-sin9k  3 месяца назад +4

      Обязательно) обзор + поковыряем корнер кейсы)

  • @nvdedmz
    @nvdedmz 3 месяца назад

    null абортконтроллеров

  • @user-md5mw1tp3e
    @user-md5mw1tp3e 3 месяца назад

    Ха! Целых 6 раз аборт контроллер вызывается! Из нескольких сотен запросов...

    • @it-sin9k
      @it-sin9k  3 месяца назад

      это на 4 больше чем у нас))

  • @shrekpar
    @shrekpar 3 месяца назад +16

    Вот и сюда пришла реклама занявшая 1/4 всего видео :(

    • @it-sin9k
      @it-sin9k  3 месяца назад +13

      У нас не было рекламы примерно пол года) поэтому надеюсь терпимость и даже осмелюсь попросить поддержку перейти разок по ссылке)

    • @KGZVER
      @KGZVER 3 месяца назад

      @@it-sin9kдаже на комментарии с недовольством рекламы включили рекламу)

    • @it-sin9k
      @it-sin9k  3 месяца назад +6

      надо же как то из лимонов делать лимонад))

    • @user-rd4fy3lr3i
      @user-rd4fy3lr3i 3 месяца назад +10

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

    • @Icanfly-
      @Icanfly- 3 месяца назад

      @@it-sin9k у меня хоть и стоит пропуск рекламы но сходил по ссылке, спасибо за труд

  • @Kira_sk
    @Kira_sk 3 месяца назад

    Дело в том что бек тоже должен обрабатывать аборт, у нас к примеру не умеет и смысла мне использовать нету

    • @it-sin9k
      @it-sin9k  3 месяца назад +1

      хмм, а что сервер должен делать? вроде это же на клиенте просто рветься соединение.

    • @Kira_sk
      @Kira_sk 3 месяца назад

      @@it-sin9k да но сервер его уже принял, отправил запрос в базу и тут я сказал ему что данные этого запроса меня уже не интересуют, со своей стороны понятно я сэкономлю трафик, а со стороны бека, разве не должно быть такой же аборт для остановки запроса в БД

    • @romandeveloper7720
      @romandeveloper7720 3 месяца назад

      @@it-sin9k на клиенте. это чувак бредит чутка

    • @archibaldstriebendrossel
      @archibaldstriebendrossel 3 месяца назад

      @@it-sin9k PHP, например, по дефолту прибивает скрипт сразу же, как рвётся соединение. В общем случае, сервер может это обрабатывать (при желании) с помощью бэкэндного аналога AbortController.

    • @Kira_sk
      @Kira_sk 3 месяца назад

      @@it-sin9k да, запрос на сервере вызовет запрос в бд, то что мы его остановим не обрывает запрос сервера. Ну вызвали, для update нет смысла абортить, а в случае использования кеширования то и на гет смысла нет

  • @victormog
    @victormog 3 месяца назад +1

    Оффтоп: *Что случилось с Yarn?*

    • @Dmitriy-bq2xh
      @Dmitriy-bq2xh 3 месяца назад

      он уже не тот

    • @victormog
      @victormog 3 месяца назад

      @@Dmitriy-bq2xh я понял, что "не тот"...

  • @dimonsoftinfo
    @dimonsoftinfo 3 месяца назад +3

    Вариант с игнорированием череват исчерпанием ширины канала или превышением количества открытых сокетов (если используется HTTP/1).
    Обычно для решения подобных задач есть специализированные решения на подобии RxJS (особенно актуально для Angular). Там это можно сделать просто оператором switchMap.
    Жаль что React разработчики боятся использовать RxJS или ленятся использовать хотя бы AbortController.

    • @grenadier4702
      @grenadier4702 3 месяца назад +2

      Использовать целую библиотеку для одной функции - такое себе. AbortController самое то

    • @dimonsoftinfo
      @dimonsoftinfo 3 месяца назад

      @@grenadier4702 разумеется если у вас маленькое приложение. Но в каком-нибудь здоровенном энтерпрайз приложении использование специализированного решения позволяет сократить время разработки и поднять качество кода.
      К тому же нет ничего плохого в том чтобы использовать аж целую библиотеку для одного случая. Все равно основная часть библиотеки будет отброшена. Также это исключает необходимость переписывания на специализированное решение впоследствии при разрастании приложения.

    • @grenadier4702
      @grenadier4702 3 месяца назад +1

      @@dimonsoftinfo достаточно либо найти маленькую библиотеку под конкретное решение, либо самому один раз написать, протестировать и использовать во всех своих проектах

    • @archibaldstriebendrossel
      @archibaldstriebendrossel 3 месяца назад

      Вы несколько раз повторяете "специализированное решение" говоря про RxJS. Специализированное для чего?

    • @archibaldstriebendrossel
      @archibaldstriebendrossel 3 месяца назад

      RxJS - это про потоки событий. Их можно мапить, фильтровать, мёрджить и ещё стопицот "операторов". На фронте такая концепция как собаке пятая нога. Чаще всего проще (и лучше) написать тупой обработчик клика (одного), а не складывать клики в поток обвешанный "операторами". Штука крутая, никто не спорит, но либо в других задачах, либо как разминка для мозгов, либо, на худой конец, как повод выпендриться перед посонами в подвёрнутых штанишках. На фронте в продакшене от неё только повышенная сложность и около нуля пользы.

  • @ihateidiots9484
    @ihateidiots9484 3 месяца назад

    React настолько уныл, что даже в документации к нему рекомендуют бред с булевой переменной ignore