forkJoin不适用于AngularFire2 valueChanges

Mat*_*hyn 4 rxjs firebase rxjs5 angularfire2 angular

请帮我解决一个我正在努力的问题.

我有一组Firebase对象键

const keys = ['-Kx9pqoMWlJLbKLQcAkP', '-Kx9pqoOYlDHTJ64Was5']
Run Code Online (Sandbox Code Playgroud)

我要做的是使用一个流中的所有Firebase对象forkJoin.这就是我所拥有的:

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
    };
Run Code Online (Sandbox Code Playgroud)

fbService方法是:

getObj(key): Observable<MyObj> {
  return this.fb.object(`/path/to/obj/${key}`).valueChanges();
}
Run Code Online (Sandbox Code Playgroud)

我认为这种getObj方法效果不好forkJoin,也许是因为valueChanges我正确使用它?

然而:

那么,我做错了什么?我的目标是从键数组中获取对象数组:

['-Kx9pqoMWlJLbKLQcAkP', '-Kx9pqoOYlDHTJ64Was5'] => [{prop:'val'},{prop:'val2'}]
Run Code Online (Sandbox Code Playgroud)

mar*_*tin 5

forkJoin运营商要求所有源观测量发射至少一个项目,并完成.

我对firebase了解不多,但我怀疑它valueChanges永远不会完成所以这就是为什么forkJoin永远不会发出任何东西.使用它的一种方法是使用take(1)始终完成链.

forkJoin(obj1.take(1), obj2.take(1)).subscribe(res => console.log(res);
Run Code Online (Sandbox Code Playgroud)

也许在你的情况下,最好使用zip()只需要所有源Observable发出相同数量项的运算符.但是请确保取消订阅,因为在源Observables完成之前它不会完成.

  • 我刚刚检查了文档。是的,它们永远不会完成。我想 OP 或者必须使用`.combineLatest()` (2认同)
  • 因为第一个参数是为每个项调用的`next`处理程序.如果要检查Observable是否完成,可以使用例如.这个:`.subscribe(undefined,undefined,()=> console.log('complete'))` (2认同)