[英]forkJoin doesn't work with AngularFire2 valueChanges
請幫我解決一個我正在努力的問題。
我有一組 Firebase 對象鍵
const keys = ['-Kx9pqoMWlJLbKLQcAkP', '-Kx9pqoOYlDHTJ64Was5']
我想要做的是使用forkJoin
在一個流中獲取所有這些 Firebase 對象。 這是我所擁有的:
const obj1 = this.fbService.getObj(keys[0]);
const obj2 = this.fbService.getObj(keys[1]);
forkJoin([obj1, obj2])
.subscribe(res => {
console.log(res); // <-- this never happens
};
fbService 方法是:
getObj(key): Observable<MyObj> {
return this.fb.object(`/path/to/obj/${key}`).valueChanges();
}
我認為這個getObj
方法不適用於forkJoin
,也許是因為valueChanges
,我是否正確使用它?
然而:
getObj
適用於獲取單個 Firebase 對象,例如:
this.fbService.getObj(keys[0]) .subsribe(res => console.log(res))// <-- works
forkJoin
適用於簡單的 HTTP 請求,例如
const r1 = this.http.get('https://swapi.co/api/people/1'); forkJoin([r1]) .subscribe(res => { console.log(res); // <-- works };
那么,我做錯了什么? 我的目標是從鍵數組中獲取對象數組:
['-Kx9pqoMWlJLbKLQcAkP', '-Kx9pqoOYlDHTJ64Was5'] => [{prop:'val'},{prop:'val2'}]
forkJoin
操作符要求所有源 Observable 至少發出一項並完成。
我對 firebase 了解不多,但我懷疑valueChanges
永遠不會完成,這就是為什么forkJoin
永遠不會發出任何東西。 解決這個問題的一種方法是使用take(1)
來完成整個鏈。
forkJoin(obj1.take(1), obj2.take(1)).subscribe(res => console.log(res);
也許在您的情況下,最好使用zip()
運算符,它只要求所有源 Observable 發出相同數量的項目。 但是請確保您取消訂閱它,因為它在其源 Observables 完成之前不會自行完成。
@martin 已經提供了正確答案,但是代碼示例需要更新為新的 RxJS 語法:
forkJoin(obj1.pipe(take(1)), obj2.pipe(take(1))).subscribe(res => console.log(res));
嘗試使用startWith
運算符
getObj(key): Observable<MyObj> {
return this.fb.object(`/path/to/obj/${key}`)
.valueChanges.pipe(starWith(value)); // value can be default obj to trigger stream
}
可能是因為
valueChanges
在您手動觸發流之前不會開始發出,因此在所有源 Observables 至少發出一次之前,forkJoin
不會觸發; 所以我們讓它們都立即發出它們的默認值。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.