我有一个ionic 3应用程序,我从多个用户那里获取数据,我想创建一个页面,用户可以看到他自己添加到网站上的自己的商品,我拥有的唯一标识符是电子邮件。
服务
getMyAds(page, email): Observable<any[]> {
return this.http.get(this.api_url + page)
.flatMap((ads: any[]) => {
if (ads.length > 0) {
return Observable.forkJoin(
ads.map((ad: any) => {
if (ad.email == email) { --> this is causing the problem
return this.http.get(this.ads_thumb_url + ad.id)
.map((res: any) => {
let media: any = res;
ad.media = media;
return ad;
});
}
})
);
}
return Observable.of([]);
});
}
page.ts
constructor(public navCtrl: NavController, public navParams: NavParams, public renderer: Renderer, public zone: NgZone, public adsProvider: AdsProvider) {
if (localStorage.getItem('wpIonicToken')) {
this.localstorageString = localStorage.getItem('wpIonicToken');
this.user = JSON.parse(this.localstorageString);
this.loadAds();
}
}
loadAds(infiniteScroll?) {
this.adsProvider.getMyAds(this.page, this.user.user_email).subscribe((data: any) => {
this.items = this.items.concat(data);
if (infiniteScroll) {
infiniteScroll.complete();
}
});
}
我从localStorage
收到电子邮件,并将其传递到getMyAds()
RunTime Error: You provided an invalid object where a stream was expected. You can provide an Observable, Promise, Array, or Iterable
我想我可以通过rxjs来解决它,而不是做if ..
,但是我对Rxjs并不擅长。
我通过检查给定电子邮件的数据来过滤page.ts
的数据,但没有用。无论如何,从服务中进行过滤不是更好吗?
答案 0 :(得分:1)
看起来您应该使用.filter和.map来创建forkJoin数组。
如果您不从Array.map返回任何内容,它仍将包含该输入项的元素,但它将是未定义的-因此,您尝试进行forkJoin连接的某些项是不可观察的,这将导致错误见过。
这应该可以解决问题:
getMyAds(page, email): Observable<any[]> {
return this.http.get(this.api_url + page)
.flatMap((ads: any[]) => {
if (ads.length > 0) {
return Observable.forkJoin(
ads.filter((ad: any) => ad.email == email).map((ad) => {
return this.http.get(this.ads_thumb_url + ad.id)
.map((res: any) => {
let media: any = res;
ad.media = media;
return ad;
});
})
);
}
return Observable.of([]);
});
}