Use cases/Offline queue — отправка после reconnect
Use cases · 34 反
Offline queue — отправка после reconnect
Паттерн
Пользователь в метро без сети, но продолжает работать в приложении — создаёт заметки, отправляет сообщения. Эти действия копятся в очереди. Когда сеть вернулась — отправляем всё, причём в том же порядке.
Какую проблему решаем
Порядок важен: «создать товар» должно уйти раньше «обновить товар». Если просто отправить накопленные actions параллельно — backend получит их вразнобой и может рассыпаться. Императивный массив-очередь мутируется из разных обработчиков (online/action), легко рассинхронизировать.
Операторы и зачем они нужны
merge — объединяет два потока: новые actions и события reconnect.
scan — хранит состояние очереди как чистая функция (никаких мутаций массива).
filter — на flush пропускаем дальше только непустую очередь.
concatMap — отправляем actions СТРОГО последовательно. Порядок сохранён.
Подводные камни
mergeMap вместо concatMap — параллельная отправка, порядок нарушен.
switchMap — следующий reconnect отменит flush, и часть actions не уйдёт.
Решите заранее: что делать с ошибкой одного action? Остановить очередь? Перенести в конец очереди для retry? Удалить и логировать? Без решения — неконтролируемое поведение.
Что в итоге получаем
Offline-действия не теряются и уходят на backend в правильном порядке после reconnect.