展平 Observable<Observable<Object[]>>
Flatten Observable<Observable<Object[]>>
我正在尝试在 Firebase 中创建连接。
因此,我从数据库中异步获取 ID 数组,然后为每个 ID 异步加载实际对象。该函数应该 return Observable
因此,对于第一个异步请求,我得到了 Observable(字符串是 ID)。
所以,无论我在这里尝试什么,我都会得到 Observable 或其他一些我不想得到的东西。
代码:
getUserFavourites(userId = ""):Observable<any[]> {
return this.af.database.list('/ranks_by_user/likes/'+userId, {
query: {
orderByKey: true,
limitToFirst: 50
}
}).flatMap( (likes:any[]) => {
return like.map(like => {
return this.af.database.object("/citations/" + like.$key)
});
});
}
错误是:
Type 'Observable<FirebaseObjectObservable<any>>' is not assignable to type 'Observable<any[]>'.
您可以使用 forkJoin
来获取引用数组。请注意,first
运算符用于从 object
observables 获取当前值,因为 forkJoin
需要 observables 完成:
import { Observable } from "rxjs/Observable";
import "rxjs/add/observable/forkJoin";
import "rxjs/add/operator/first";
import "rxjs/add/operator/switchMap";
getUserFavourites(userId): Observable<any[]> {
return this.af.database.list('/ranks_by_user/likes/' + userId, {
query: {
orderByKey: true,
limitToFirst: 50
}
})
.switchMap((likes: any[]) => Observable.forkJoin(
likes.map(like => this.af.database.object("/citations/" + like.$key).first())
));
}
forkJoin
接受一个可观察对象数组,return 一个可观察对象发出一个可观察对象的最终值数组。
如果您要 return Citation
个实例,则需要创建它们(大概使用数据库中的值)。您可以使用 map
运算符来做到这一点:
import "rxjs/add/operator/map";
...
likes.map(like => this.af.database.object("/citations/" + like.$key).first().map(value => new Citation(value)))
...
我正在尝试在 Firebase 中创建连接。
因此,我从数据库中异步获取 ID 数组,然后为每个 ID 异步加载实际对象。该函数应该 return Observable
因此,对于第一个异步请求,我得到了 Observable(字符串是 ID)。 所以,无论我在这里尝试什么,我都会得到 Observable 或其他一些我不想得到的东西。
代码:
getUserFavourites(userId = ""):Observable<any[]> {
return this.af.database.list('/ranks_by_user/likes/'+userId, {
query: {
orderByKey: true,
limitToFirst: 50
}
}).flatMap( (likes:any[]) => {
return like.map(like => {
return this.af.database.object("/citations/" + like.$key)
});
});
}
错误是:
Type 'Observable<FirebaseObjectObservable<any>>' is not assignable to type 'Observable<any[]>'.
您可以使用 forkJoin
来获取引用数组。请注意,first
运算符用于从 object
observables 获取当前值,因为 forkJoin
需要 observables 完成:
import { Observable } from "rxjs/Observable";
import "rxjs/add/observable/forkJoin";
import "rxjs/add/operator/first";
import "rxjs/add/operator/switchMap";
getUserFavourites(userId): Observable<any[]> {
return this.af.database.list('/ranks_by_user/likes/' + userId, {
query: {
orderByKey: true,
limitToFirst: 50
}
})
.switchMap((likes: any[]) => Observable.forkJoin(
likes.map(like => this.af.database.object("/citations/" + like.$key).first())
));
}
forkJoin
接受一个可观察对象数组,return 一个可观察对象发出一个可观察对象的最终值数组。
如果您要 return Citation
个实例,则需要创建它们(大概使用数据库中的值)。您可以使用 map
运算符来做到这一点:
import "rxjs/add/operator/map";
...
likes.map(like => this.af.database.object("/citations/" + like.$key).first().map(value => new Citation(value)))
...