интервалу происходило какое-то действие, а при отписке этот интервал автоматически очищался.
Какой оператор для этого подойдёт?
interval
Это понятно, а как прозрачно прикрепить интервал к другому Ovservable?
До тех пор, пока пользователь подписан на сообщения в чате, надо раз в 10 секунд отправлять на сервер, что у него статус онлайн
interval().pipe(switchMap(() => service.getData())).subscribe()
Как сделать это бэкграунд-таском к основному Ovservable подписки на сообщения? declare const messages$: Observable<{text: string}> const sub = messages$.subscribe() // интервал автоматически стартует sub.unsubscribe() // Интервал автоматически очищается
То, что я скинул, так и работает
Вы просто скинули мне базовый пример интервала. Я спрашиваю как связать интервал с основным Observable
messages$.pipe(switchMap(() => interval()), switchMap(() => service.markOnline())).subscribe() В чем проблема. не понимаю
Во первых - каждое новое сообщение с сервера будет создаваться новый интервал. Он должен работать независимо от сообщений. Во вторых - сами сообщения мы теперь не можем получить в подписке - вместо этого получаем ответ от markOnline()
А, так как у вас тут switchMap, то если каждые 9 минут 59 секунд мы будем получать по сообщению, то markOnline не вызовется никогда, так как rxjs interval() не срабатывает на нулевой секунде, в отличие от JS setInterval()
В такой ситуации желание связать два observable только для отписки немного иррационально Это делается через takeUntil(destroySubject), когда делаем destroySubject.next(), то оба observable останавливаются
Вполне рациональное желание. Можете объяснить его иррациональность? Я уже нашёл красивый и лаконичный способ, спасибо за внимание
Поделитесь, пожалуйста, мне стало интересно, может я не так понял задачу
https://stackblitz.com/edit/rxjs-tjpumh?devtoolsheight=60
Действительно интересное решение, спасибо Иррациональным я посчитал так как для меня в принципе идея объединить их непонятна, на мой взгляд это все же независимые операции
Это был пример. На самом деле задача другая, просто более сложная из специфической предметной области. Но суть та же. Но даже в рамках этого примера -операции-то независимые. Именно поэтому они реализованы двумя разными Observable. Но если есть бизнес-требование, что пользователь онлайн пока он слушает чат - то мы связываем их и экспортируем один observable как API
Забавно Не думал, что условия настолько жесткие, я привык думать в формате ngrx-экшенов и сервисов, когда есть определенное событие и это событие может запустить все что угодно Вообще, без сомнения нужно было использовать операторы объединения, но я впервые вижу применение ignoreElements :)
Обсуждают сегодня