首页 > 解决方案 > 错误类型错误:订阅不是 Ionic 4 中的函数

问题描述

我正在使用 Ionic News App。我在从服务文件中获得响应时遇到了一个问题。

主页.ts

getNews(): void {
       this.loading = true;
       this.language = localStorage.language;
       this.checkForToken();
       var userId = this.loggedInUser;
       this._newsService.getAllNews().subscribe(
           (res: any) => {
               console.log("all news==========>", res)
               this.loadNewsToPage(res, userId);
           },
           (err) => {
               this.loading = false;
               this.error = err;
           });
   }

新闻服务.ts

getAllNews(){
        if(this.network.type == 'none' ){
            console.log(JSON.parse(localStorage.getItem("newsArray")));
            this.newsArray = JSON.parse(localStorage.getItem("newsArray"))
            return this.newsArray;
        }else{    
            return this.http.get(config.baseApiUrl + 'news?isApproved=APPROVED').pipe(
                map((res) => {
                    this.newsArray = res['data'];
                    localStorage.setItem('newsArray',JSON.stringify(this.newsArray))
                    return this.newsArray;
                }),
                catchError(this.handleError));
        }
    }

现在的问题是当网络为“无”时,它会进入服务文件中的“如果”条件并从本地存储返回响应。但是当网络没有时,它会给我以下错误。

错误类型错误:this._newsService.getAllNews(...).subscribe 不是函数

当它进入其他条件或存在网络时,它可以正常工作。为什么会这样?

标签: javascriptionic-frameworkserviceangular7ionic4

解决方案


您的getAllNews函数不是 Observable。所以你不能订阅它。请参阅下面的示例,其中您为第一个 if 条件和第二个 else 条件返回一个 Observable。您需要在每个下一个函数之后使用 observer.complete() 关闭 Observable。

getAllNews(): Observable<any>{
  return new Observable(observer => {
    if(this.network.type == 'none' ){
      console.log(JSON.parse(localStorage.getItem("newsArray")));
        this.newsArray = JSON.parse(localStorage.getItem("newsArray"))
        observer.next(this.newsArray);
        observer.complete();
    } else{    
      this.http.get(config.baseApiUrl + 'news?isApproved=APPROVED').subscribe(
        (result: object) => {
          this.newsArray = result['data'];
          localStorage.setItem('newsArray',JSON.stringify(this.newsArray))
          observer.next(this.newsArray);
          observer.complete();
        },
        (error) => {
          observer.error(error);
        });
      }
  });
 }

您现在可以访问订阅>结果中的下一个块和订阅>错误中的错误块。

this._newsService.getAllNews().subscribe(
  (res: any) => { // observer.next() brings you here
    console.log("all news==========>", res)
    this.loadNewsToPage(res, userId);
  },
  (err) => { // observer.error() brings you here
    this.loading = false;
    this.error = err;
  });

推荐阅读