通过电子邮件过滤响应:您提供了一个无效的对象,该对象应在其中流

时间:2018-07-23 14:31:46

标签: angular ionic-framework ionic3

我有一个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的数据,但没有用。无论如何,从服务中进行过滤不是更好吗?

1 个答案:

答案 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([]);
      });
  }