我开始尝试使用Angular 6和Firebase。我想使用Hacker News API来显示feeds(内容)。
我想返回一个Thing类的可观察数组。首先,我需要一个feed ID的数组,所以我调用Firebase来获取这些ID。然后,我想获取我已经拥有的每个ID的feeds,并将其作为单个可观察的feeds数组返回。
到目前为止,我的代码如下:
getThings(limit: number): Observable<any> {
return this.db.list('/v0/beststories', ref => ref.limitToFirst(limit).orderByKey())
.valueChanges() // returns an Observable of IDs
.pipe(
flatMap(itemIds => {
if (itemIds.length > 0) {
let sources = itemIds.map(itemId => defer(() => {
let pathOrRef = '/v0/item/' + itemId;
return this.db.object(pathOrRef).valueChanges();
}));
// sources are the array of Observables
return forkJoin(sources);
} else {
return Observable.create([]);
}
})
);
}
我认为从数组中进行flatMapping会是解决方法,但是我得到了错误信息:You provided an invalid object where a stream was expected. You can provide an Observable, Promise, Array, or Iterable
。
我尝试按照RxJs Array of Observable to Array中的方式做,但是我不知道哪里出错了。
在返回的Observable上调用subscribe后会抛出错误。
this.hackerNewsService.getThings(20).subscribe(console.log);
我在下面的代码片段中重现了类似的情况:https://stackblitz.com/edit/angular-8qtokd?file=src%2Fapp%2Fapp.component.ts。请注意,这个链接包含了一个示例代码,涉及到IT技术相关内容。
flatMap
返回一个observable,就像你在else
中所做的那样。因此,您需要使用of
或在flatMap
内部进行另一个http调用并返回observable。 - windmaomaoflatMap
中? - martin