forkJoin不适用于AngularFire2 valueChanges

前端之家收集整理的这篇文章主要介绍了forkJoin不适用于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完成之前它不会完成.

猜你在找的Angularjs相关文章