Использование реакции с запросом RTK может привести к утечке памяти на размонтированном компоненте

#reactjs #redux #rtk-query

Вопрос:

При использовании запроса RTK в компоненте React очень возможно возникновение ошибки утечки памяти / отсутствия операции, если компонент будет отключен до завершения запроса.

Например, если вы используете isError или isSuccess RTK попытается установить их, даже если компонент размонтирован.

Ранее я вручную проверял, что выборка не была прервана, и устанавливал состояние только в случае необходимости. Я не уверен, как справиться с этим с помощью запроса RTK, в котором состояние обрабатывается автоматически.

Возможно, я неправильно понимаю, как с этим бороться, или RTK-запрос может справиться с этим каким-то неизвестным мне способом.

Ответ №1:

На данный момент это сообщение об ошибке можно проигнорировать, потому что на самом деле оно уже исчезает в React 18:

https://github.com/reactwg/react-18/discussions/82

Подводя итог, мы удаляем это предупреждение. Случай, для которого это актуально (подписки), не очень часто встречается в коде продукта и обычно инкапсулируется в пользовательских крючках и библиотеках. Случай, с которым сталкивается большинство разработчиков продуктов, — это тот, когда это предупреждение не только бесполезно/вводит в заблуждение, но и подталкивает разработчиков к худшим решениям, пытаясь подавить предупреждение. Надеюсь, это изменение уменьшит путаницу и позволит вам удалить из кода кучу смонтированных проверок.

Комментарии:

1. Спасибо! Я понятия не имел, что это такое.

Ответ №2:

Это ваша интерпретация или вы действительно получаете сообщение об ошибке здесь? В RTK-запросе эти данные будут сохранены в хранилище (в случае, если вы вернетесь назад), но будут удалены через 60 секунд, если ни один компонент, использующий их, не монтируется. Утечка памяти практически невозможна, она просто не привязана к отдельному компоненту, потому что она основана на Redux.

Комментарии:

1. Это происходит. Я протестировал его, выполнив запрос по нажатию кнопки, на выполнение которого ушло не менее 5 секунд. Я сразу же сошел со страницы. Через 5 секунд unmounted component в консоли отобразится сообщение об ошибке. Возможно, у меня что-то настроено неправильно, однако я не думаю, что это так, и мои варианты использования довольно просты.

2. Не могли бы вы, пожалуйста, проверить, по-прежнему ли это происходит с последней бета-версией версии v1.7, и если это так, пожалуйста, откройте проблему с воспроизведением?

3. Будет сделано! Я настроил этот небольшой тест исключительно для того, чтобы проверить, была ли это проблема с RTK, поскольку у меня были те же мысли, что и у вас.