代码之家  ›  专栏  ›  技术社区  ›  Lynob

按电子邮件筛选响应:在需要流的位置提供了无效对象

  •  1
  • Lynob  · 技术社区  · 6 年前

    我有一个离子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。

    我从中过滤 第TS页 通过检查给定电子邮件的数据,它不起作用。不管怎样,从服务中过滤的效果不是更好吗?

    1 回复  |  直到 6 年前
        1
  •  1
  •   Mark Hughes    6 年前

    看起来您应该使用.filter和.map来创建forkjoin数组。

    如果不从array.map返回任何内容,它仍将包含该输入项的元素,但它将是未定义的-因此,您试图分叉连接的某些项是不可见的,这将导致所看到的错误。

    这样可以解决以下问题:

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