При использовании функции подписки получение не может считаться неопределенным - PullRequest
0 голосов
/ 10 марта 2019

Я пытаюсь получить информацию от другого компонента, который отправляет HTTP-запрос с API YouTube, и я получаю эту проблему:

Cannot read property 'subscribe' of undefined
at SafeSubscriber._next (profile.page.ts:20)

этот код компонента, отсюда я пытаюсь получить информацию от службы:

  constructor(private db:FirebaseService,private afauth:AuthService) { 
  this.db.getDataObj("/Profile/" + this.uid).subscribe(res =>{
     this.profileInfo= res;
     this.afauth.getYoutubeData(res.channel).subscribe(data =>{
       console.log(data);
  })
})}

это код функции службы, отправляющей запрос http:

 getYoutubeData(ch):any{
  let m="https://www.googleapis.com/youtube/v3/channels? 
  part=snippet%2CcontentDetails%2Cstatistics&id=" + ch + "&key=" + api ;
  this.http.get(m).subscribe(data =>
  { 
   this.youtubeObj=data.items["0"].statistics;
   return this.youtubeObj;
 })

}

Ответы [ 3 ]

1 голос
/ 10 марта 2019

Вам необходимо исправить свой метод getYoutubeData в сервисе, удалив подписку и вернув this.http.get.Чтобы получить data.items["0"].statistics из подписки на getYoutubeData, используйте операторы pipe & map:

import { catchError, map } from 'rxjs/operators';

getYoutubeData(ch): any {
  let m="https://www.googleapis.com/youtube/v3/channels? 
  part=snippet%2CcontentDetails%2Cstatistics&id=" + ch + "&key=" + api;
  return this.http.get(m).pipe(
    map(data => data.items["0"].statistics),
    catchError(err => {
      console.log(err);
    });
  )
}
0 голосов
/ 10 марта 2019

Проблема здесь в том, что вы не можете в принципе вернуть данные из subscribe.Таким образом, решение здесь будет просто возвращать Observable и получать данные в конструкторе компонента.

.service.ts

 getYoutubeData(ch):any{
  let m="https://www.googleapis.com/youtube/v3/channels? 
  part=snippet%2CcontentDetails%2Cstatistics&id=" + ch + "&key=" + api ;
  return this.http.get(m);
}

* .component.ts

constructor(private db:FirebaseService,private afauth:AuthService) { 
  this.db.getDataObj("/Profile/" + this.uid).subscribe(res =>{
     this.profileInfo= res;
     this.afauth.getYoutubeData(res.channel).subscribe(data =>{
       console.log(data.items["0"].statistics);
  })
})}
0 голосов
/ 10 марта 2019

Вы уже подписаны методом getYoutubeData. Вы можете подписаться только один раз. В вашем методе, пожалуйста, используйте метод pipe и tab, например:

getYoutubeData(ch):any{
  let m="https://www.googleapis.com/youtube/v3/channels? 
  part=snippet%2CcontentDetails%2Cstatistics&id=" + ch + "&key=" + api ;
  return this.http.get(m).pipe(tap(data =>
  { 
   this.youtubeObj=data.items["0"].statistics;
   return this.youtubeObj;
 }))
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...