ОШИБКА TypeError: подписка не является функцией в Ionic 4 - PullRequest
0 голосов
/ 16 октября 2019

Я делаю с приложением Ionic News. У меня одна проблема с получением ответа из служебного файла.

home.page.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;
           });
   }

news.service.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));
        }
    }

Теперь проблема заключается в том, что когда сеть «отсутствует», она переходит в состояние «если» в служебном файле и возвращает ответ из локального хранилища. Но это дает мне ошибку ниже, когда сеть отсутствует.

ОШИБКА TypeError: this._newsService.getAllNews (...). Подписаться не является функцией

Это работаетправильно, когда он переходит в другое состояние или когда сеть присутствует. Почему так?

1 Ответ

2 голосов
/ 16 октября 2019

Ваша getAllNews функция не является наблюдаемой. Так что вы не можете подписаться на него. См. Пример ниже, где вы возвращаете Observable для первого условия if и второго условия else. Вам нужно закрывать Observable с помощью наблюдателя.complete () после каждой следующей функции.

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;
  });
...