2016-05-31 2 views
1

У меня есть служебный вызов от моего компонента, который получает список героев. Из этой функции, где он вызывает другую функцию, которая имеет http-запрос ... Как я могу подписаться на вызов функции, чтобы я получил ответ правильно. ..здесь мой plunker демо http://plnkr.co/edit/UM9STMwaOsgolhBjADjx?p=preview ... Это, как я звоню службу из моего компонентаКак использовать наблюдаемые в угловых услугах?

ngOnInit() { 
       this.heroService.getHeroes() 
       .subscribe(
        heroes => this.heroes = heroes, 
        error => this.errorMessage = <any>error); 
} 

и в моем классе обслуживания я назвал этот метод, который вызывает другой метод, который имеет запрос HTTP и подписался к этому ...

getHeroes(){ 
return this.GetListOfHeroes() 
     .subscribe((data: any) => { 
      return data; 
     } 
     ); 
} 

И, наконец, это i S метод, который получает список ...

GetListOfHeroes(){ 
    return this.http.get(this.heroesUrl) 
       .map(this.extractData) 
       .catch(this.handleError); 
} 

Если я непосредственно вызывать GetListOfHeroes() метод из моего компонента он работает нормально, но если я пытаюсь вызвать что из другого метода он показывает эту ошибку this.heroService.getHeroes(...).subscribe is not a function кто-нибудь пожалуйста скажите я, где я делаю неправильно ... Спасибо

ответ

2

Использование .map(...) вместо .subscribe(...) в getHeroes() как:

getHeroes(){ 
    return this.GetListOfHeroes() 
    .map((data: any) => { 
     return data; 
    }); 
    } 

Этот путь getHeroes() возвращает Observable в то время как с .subscribe() он возвращает Subscription вы не можете подписаться.

1

На самом деле, вы должны подписаться в методе getHeroes, так как он вернет подписку, а не наблюдаемую.

getHeroes(){ 
    return this.GetListOfHeroes() 
    .subscribe((data: any) => { // <----- 
     return data; 
    }); 
} 

Метод subscribe может быть вызван только на наблюдаемый. Объект подписки можно отменить для подписки ...

Фактически, это зависит от того, что вы хотите сделать в методе getHeroes. Например, вы можете использовать оператора do или map. Вот пример:

getHeroes(){ 
    return this.GetListOfHeroes() 
    .do((data: any) => { // <----- 
     // do something with data 
    }) 
    .map((data: any) => { 
     // return something else in the data flow 
     return { attr: 'value' }; 
    }); 
}