169 похожих чатов

Мне надо, чтобы при подписке на Ovservable в фоне по

интервалу происходило какое-то действие, а при отписке этот интервал автоматически очищался.
Какой оператор для этого подойдёт?

18 ответов

18 просмотров

interval

Dilame-Bowzee Автор вопроса
Raman Yazvinski
interval

Это понятно, а как прозрачно прикрепить интервал к другому Ovservable?

Dilame-Bowzee Автор вопроса
Raman Yazvinski
Пример?

До тех пор, пока пользователь подписан на сообщения в чате, надо раз в 10 секунд отправлять на сервер, что у него статус онлайн

Dilame-Bowzee Автор вопроса
Raman Yazvinski
interval().pipe(switchMap(() => service.getData())...

Как сделать это бэкграунд-таском к основному Ovservable подписки на сообщения? declare const messages$: Observable<{text: string}> const sub = messages$.subscribe() // интервал автоматически стартует sub.unsubscribe() // Интервал автоматически очищается

Dilame-Bowzee Автор вопроса
Raman Yazvinski
То, что я скинул, так и работает

Вы просто скинули мне базовый пример интервала. Я спрашиваю как связать интервал с основным Observable

Dilame Bowzee
Вы просто скинули мне базовый пример интервала. Я ...

messages$.pipe(switchMap(() => interval()), switchMap(() => service.markOnline())).subscribe() В чем проблема. не понимаю

Dilame-Bowzee Автор вопроса
Raman Yazvinski
messages$.pipe(switchMap(() => interval()), switch...

Во первых - каждое новое сообщение с сервера будет создаваться новый интервал. Он должен работать независимо от сообщений. Во вторых - сами сообщения мы теперь не можем получить в подписке - вместо этого получаем ответ от markOnline()

Dilame-Bowzee Автор вопроса
Raman Yazvinski
messages$.pipe(switchMap(() => interval()), switch...

А, так как у вас тут switchMap, то если каждые 9 минут 59 секунд мы будем получать по сообщению, то markOnline не вызовется никогда, так как rxjs interval() не срабатывает на нулевой секунде, в отличие от JS setInterval()

Dilame Bowzee
А, так как у вас тут switchMap, то если каждые 9 м...

В такой ситуации желание связать два observable только для отписки немного иррационально Это делается через takeUntil(destroySubject), когда делаем destroySubject.next(), то оба observable останавливаются

Dilame-Bowzee Автор вопроса
Raman Yazvinski
В такой ситуации желание связать два observable то...

Вполне рациональное желание. Можете объяснить его иррациональность? Я уже нашёл красивый и лаконичный способ, спасибо за внимание

Dilame Bowzee
Вполне рациональное желание. Можете объяснить его ...

Поделитесь, пожалуйста, мне стало интересно, может я не так понял задачу

Dilame-Bowzee Автор вопроса
Dilame Bowzee
https://stackblitz.com/edit/rxjs-tjpumh?devtoolshe...

Действительно интересное решение, спасибо Иррациональным я посчитал так как для меня в принципе идея объединить их непонятна, на мой взгляд это все же независимые операции

Dilame-Bowzee Автор вопроса
Raman Yazvinski
Действительно интересное решение, спасибо Иррацион...

Это был пример. На самом деле задача другая, просто более сложная из специфической предметной области. Но суть та же. Но даже в рамках этого примера -операции-то независимые. Именно поэтому они реализованы двумя разными Observable. Но если есть бизнес-требование, что пользователь онлайн пока он слушает чат - то мы связываем их и экспортируем один observable как API

Dilame Bowzee
Это был пример. На самом деле задача другая, прос...

Забавно Не думал, что условия настолько жесткие, я привык думать в формате ngrx-экшенов и сервисов, когда есть определенное событие и это событие может запустить все что угодно Вообще, без сомнения нужно было использовать операторы объединения, но я впервые вижу применение ignoreElements :)

Похожие вопросы

Обсуждают сегодня

30500 за редактор? )
Владимир
47
а через ESC-код ?
Alexey Kulakov
29
Чёт не понял, я ж правильной функцией воспользовался чтобы вывести отладочную информацию? но что-то она не ловится
notme
18
У меня есть функция где происходит это: write_bit(buffer, 1); write_bit(buffer, 0); write_bit(buffer, 1); write_bit(buffer, 1); write_bit(buffer, 1); w...
~
13
Недавно Google Project Zero нашёл багу в SQLite с помощью LLM, о чём достаточно было шумно в определённых интернетах, которые сопровождались рассказами, что скоро всех "ибешни...
Alex Sherbakov
5
Ребят в СИ можно реализовать ООП?
Николай
33
Как передать управляющий символ в открытую через CreateProcess консоль? Собсна, есть процедура: procedure TRedirectThread.WriteData(Data: OEMString); var Written: Cardinal;...
Serjone
6
в JclConsole объявлено так: function CtrlHandler(CtrlType: DWORD): BOOL; stdcall; - где ваше объявление с stdcall? у вас на картинке нет stdcall
Karagy
8
https://github.com/erlang/otp/blob/OTP-27.1/lib/kernel/src/logger_h_common.erl#L174 https://github.com/erlang/otp/blob/OTP-27.1/lib/kernel/src/logger_olp.erl#L76 15 лет назад...
Maksim Lapshin
20
program test; {$mode delphi} procedure proc(v: int32); overload; begin end; procedure proc(v: int64); overload; begin end; var x: uint64; begin proc(x); end. Уж не знаю...
notme
6
Карта сайта