почему наблюдаемая труба не работает в компоненте? - PullRequest
0 голосов
/ 06 апреля 2020

У меня есть наблюдаемое, созданное с помощью firebase / fireStore. если я подпишу это наблюдаемое в компоненте, это работает. но если я передам это, это не сработает, хотя я и ожидаю. и я не получаю никакой ошибки. мой вопрос; почему он не работает?

мои коды;

сервис;

getLastSeans(uid) {
    return this.afs.doc<any>(`users/${uid}/lastseans/seansLive`).valueChanges();
  }

компонент;

с конвейером не работает

this.roomService.getLastSeans(this.userId).pipe(map(x=>{console.log(x);return x;}));

если я подпишусь, это будет работать так:

this.roomService.getLastSeans(this.userId).subscribe(x=>console.log(x));

Я хочу узнать, почему это произошло?

1 Ответ

2 голосов
/ 06 апреля 2020

Добавление канала не требует оценки наблюдаемого, он создает новый наблюдаемый экземпляр с дополнительными логами c, определенными в каналах, в соответствии с документами :

Трубный оператор - это функция, которая принимает Observable в качестве входных данных и возвращает другую Observable

. Для оценки новой наблюдаемой вам нужно subscribe, например, с помощью вызова .subscribe:

this.roomService.getLastSeans(this.userId)
    .pipe(map(x=>{
        console.log(x);
        return x;
    })).subscribe();

Обратите внимание, что здесь допустимо пустое .subscribe, поскольку в каналах определена логика c.

Или, изменив шаблон для использования AsyncPipe, например:

<app-live-sean *ngFor="let item of liveSeans | async"></app-live-sean>

Предполагая, что liveSeans является полем компонента, которое устанавливается как

this.liveSeans = this.roomService.getLastSeans(this.userId)
    .pipe(map(x=>{
        console.log(x);
        return x;
    }));

В этом случае AsyncPipe подпишется на это, получать результаты и отписаться от наблюдаемого, сохраняя память без утечек.

...