В прошлом я много занимался собственной мобильной разработкой как для Android (Java), так и для iOS (ObjC и Swift). Для моих приложений, подключенных к серверу, одной проблемой, которую мне пришлось решать должным образом, был обратный вызов, который вызывался после того, как приложение сделало HTTP-запрос. Например, предположим, что у меня есть экран (Activity в Android или ViewController в iOS), и внутри него я делаю HTTP-запрос к REST-серверу, ожидая в ответ какие-то данные. Большинство учебников (к сожалению) предоставляют примеры HTTP-ответа, вызывающего метод обратного вызова в самом Activity или ViewController. Да, на первый взгляд это кажется разумным, но в приложениях с несколькими Activity или ViewControllers возникает большая проблема — что произойдет, если пользователь уйдет с экрана после запроса, но до того, как вернется ответ? В этом случае приложение уничтожает память первой Activity или ViewController, поэтому, когда возвращается ответ, оно пытается вызвать метод для освобожденной памяти, что приводит к сбою.
Вместо этого нам пришлось использовать постоянный одноэлементный объект (например, класс, который расширяет приложение в Android или использовать делегат приложения в iOS) в качестве класса, реализующего функции обратного вызова. Любой экран, который хотел получить результаты, должен был зарегистрироваться для получения этих результатов (с помощью слушателей в Android или с помощью уведомлений в iOS). Если пользователь уйдет с экрана, соответствующие методы жизненного цикла экрана отменят регистрацию обработчика прослушивателя/уведомления на экране, чтобы никогда не было случая, когда метод обратного вызова вызывается для освобожденной памяти.
Теперь я начинаю использовать как React (в браузерах), так и React Native (в мобильных приложениях). Я использую модуль Axios для обработки HTTP-запросов. Опять же, все примеры, которые я вижу, показывают обратные вызовы в самом компоненте React, а не какой-либо шаблон, где есть какой-то постоянный синглтон или глобальный объект, который обрабатывает ответы и отправляет их на любые экраны, которые все еще активны на дисплее.
Итак, у меня есть несколько вопросов следующего содержания:
Для React (в браузере) это проблема? Могу ли я / должен ли я просто предоставить обратный вызов для самого компонента, и у браузера не будет проблем, если я уйду с экрана в середине запроса? Я подозреваю, что в наши дни код браузера довольно надежен, поэтому я сомневаюсь, что он приведет к сбою браузера, но вызовет ли это какие-либо проблемы с веб-приложением?
А как насчет React Native? Поскольку это в основном построено поверх нативного кода для мобильных устройств, столкнусь ли я с этой проблемой сбоя памяти, если я поставлю обратный вызов в сам компонент?
Если это проблема, существует ли хороший шаблон для использования центрального глобального постоянного объекта для обработки обратных вызовов и отправки результатов любым зарегистрированным компонентам?
Обратите внимание, что я не буду использовать избыточность в своем коде — вместо этого я планирую использовать более простую структуру (hookstate, hookstate.js.org), которая позволит мне отслеживать глобальное состояние и использовать его внутри компонентов при обновлении. Это похоже на систему обратного вызова для глобального состояния, но мне не совсем понятен лучший шаблон для включения в него HTTP-запросов через такие модули, как Axios.
Предложения?