@KiBiLizard

RxJs. почему не работают две подписки на один observable?

есть observable созданный из Subject:
private searchData$: Observable<ISearchData>;
    
    constructor (private conService: ConnectionService) {
        this.searchData$ = <Observable<ISearchData>>conService.messages.pipe(
            filter((message) => {
                return message.key === QUERYBASE.search.key;
            }),
            map ((message)=>{
                return message.data as ISearchData;
            })
        );
    }

есть метод который отправляет запрос, после которого в messages появляются те сообщения которые пройдут фильтр, и подписывается на searchData$
public startSearch(){
        let queryData: ISearchQueryData = ...

        this.searchDataSub = this.searchData$.subscribe(
            (data)=>{
                console.log("Get search data: ",data);
                if (data.hash !== this.lastHash) {
                    this.items = data.search;
                    this.lastHash = data.hash;
                }
                this.searchDone = data.done;
            }
        );
        const newSub = this.searchData$.pipe(
            delay(2000)
        ).subscribe(
            (data)=> {
                console.log("sub2", data);
                //!data.done && this.conService.search(queryData);
            }
        );

        this.conService.search(queryData);
    }


если вторую подписку выпилить - первая работает (в консоли появляется "Get search data: , ...", данные обрабатываются)
а если оставить обе, почему-то работает только вторая подписка!! (в консоли только "sub2, ...", данных нет)

Я конечно могу вставить костыль и оставить только первую подписку в которой через таймаут отправлять запрос, но блин все учебники говорят о том что можно делать два .subscribe на один observable, и без всяких выкрутасов, так почему у меня оно не работает?

.pipe убирать пробовала, та же дичь, работает только вторая подписка:
this.searchDataSub = this.searchData$.subscribe(
            (data)=>{
                console.log("Get search data: ",data);
                /*...*/
            }
        );
        const newSub = this.searchData$.subscribe(
            (data)=> {
                console.log("sub2", data);
                //...
            }
        );

так в консоли только sub2
  • Вопрос задан
  • 315 просмотров
Решения вопроса 1
dasha_programmist
@dasha_programmist
ex Software Engineer at Reddit TS/React/GraphQL/Go
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы