簡體   English   中英

forkJoin 不適用於 AngularFire2 valueChanges

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM