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

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

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

18 ответов

9 просмотров

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 :)

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

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

я не магистр хаскеля, но разве не может лейзи тип конвертнуться в не-лейзи запросив вычисление содержимого прям при инициализации?
deadgnom32 λ madao
100
короче сгенерила мне эта штука код на ассемблере: struc string val { common local .value dq .value .value: if ~val eq db val end if db 0 } fo...
Vi Chapmann Chapmann
12
Всем привет! Массив вводится с клавиатуры, кол-во элементов неизвестно, поэтому я указал arr db 100 dup(?) С нахождением максимума проблем нет, а вот минимум почему-то всегд...
En Vind Av Sorg
11
Помогите, пожалуйста, делаю программу для для подсчёта корней квадратного уравнения, знаю, что есть куча недочётов, недоработок, но основная проблема в том, что почему-то при ...
NYC
13
#include <stdio.h> int main(void) { int n; scanf("%d", &n); int digits1[n] = {0}; int digits2[n] = {0}; я не могу таким образом заранее массив нулями заполнить?
Linus
12
в сях есть множество как в питоне? для удаление дубликатов
Linus
25
читать файл максимально быстро? странный вопрос))
zamtmn
53
я про форму записи. смысл указывать что 8 байтный регистр 8 байт?
Aiwan \ (•◡•) / _bot
10
Вроде бы вопрос уже заезжанный, но тем не менее У меня есть функция menu() которая выводит набор возможных действий, а затем спрашивает у пользователя что он хотел бы сделать....
David Golovatin
3
а как бы вылезти из ИО, что то типа IO -> Ether или в какую сторону смотреть ? что то туплю
Fedor
14
Карта сайта