Иногда подписка может быть синхронной. Это происходит, когда Observable
является ReplaySubject
a BehaviorSubject
или Observable
, у которого есть shareReplay()
труба. (возможно, и другие варианты.
Это приведет к немедленному срабатыванию наблюдаемого при подписке. Однако вы никогда не должны рассчитывать на это поведение и всегда продолжать в рамках своей подписки. Или использовать каналы, такие как mergeMap, и создавать другие наблюдаемые. доступ к которому вы можете получить в своем шаблоне, используя async
pipe.
В вашем случае. this.route.params
, очевидно, является «воспроизводимой» наблюдаемой, из которой вы получаете последнее значение после подписки. В противном случае вам придется дождитесь повторного изменения параметров, пока не получите значение.
Ваш вызов базы данных не может вернуть немедленный ответ, потому что это по сути сетевой запрос.
В вашем примере кода вы можно обновить до этого и использовать async
канал в вашем шаблоне
export class FirebaseDocument implements OnInit {
readonly collection$: Observable<string> = this.route.params.pipe(
map((params) => params.collection)
);
readonly doc$: Observable<any[]> = this.db.collection(this.url).valueChanges().pipe(
shareReplay({ refCount: true, bufferSize: 1 })
);
constructor(private route: ActivatedRoute, private db: AngularFirestore) {}
ngOnInit() {
// don't forget to unsubscribe
combineLatest([
this.collection$,
this.doc$
]).subscribe((collection, document) => {
this.doMultiParameterMethod(collection, document);
});
}
}