2017-01-04 5 views
0

Я пытаюсь получить доступ к кэшированным данным в моей трубе, но всегда получает следующее сообщение об ошибке:Не может subscripe обслуживать кэш

Cannot read property 'subscribe' of undefined 

служба:

import { Injectable } from '@angular/core'; 
import {Observable} from 'rxjs/Rx'; 
import 'rxjs/observable/of'; 
import 'rxjs/add/operator/map'; 

@Injectable() 
export class FormDataService { 

    private apiUrl = "http://localhost"; 
    private data:any; 
    private observable: Observable<any>; 

    constructor(
    private _http: Http 
){} 

    getCountries() { 
    if(this.data) { 
     console.log("data available"); 
     return Observable.of(this.data); 
    } else if(this.observable) { 
     console.log("request pending") 
     return this.observable; 
    } else { 
     console.log("request data"); 
     this.observable = this._http.get(this.apiUrl + "/country") 
     .map(res => { 
      console.log("data received"); 
      this.observable = null; 
      this.data = res.json(); 
     }); 
    } 
    } 

труба:

export class ResolvePipe implements PipeTransform { 

    constructor(
    public _formDataService: FormDataService 
) {} 

    transform(value: number, args: any[]): any { 
    return this._formDataService.getCountries().subscribe(
     data => { 
     console.log(data); 
     return data; 
     } 
    ) 
    } 
} 

У меня есть другой вопрос:

API-интерфейс возвращает массив объектов

[{id:1,label:"USA",id:2, label:"DE", ...}] 

Труба должна заменить идентификатор (значение) с ярлыком ... где бы вы это сделать? В обслуживании или трубе?

Edit:

formdata.service.ts:27 request data 
formdata.service.ts:30 data received 
formdata.service.ts:27 request data 
formdata.service.ts:24 request pending (822 times) 
formdata.service.ts:30 data received 
+1

вы не можете подписаться на объект, который не существует. сначала создайте объект, затем попробуйте «подписаться» (вот что означает сообщение об ошибке) – zerohero

ответ

2

Существует возвращение отсутствует

getCountries() { 
    if(this.data) { 
     console.log("data available"); 
     return Observable.of(this.data); 
    } else if(this.observable) { 
     console.log("request pending") 
     return this.observable; 
    } else { 
     console.log("request data"); 
     this.observable = this._http.get(this.apiUrl + "/country") 
     .map(res => { 
      console.log("data received"); 
      this.observable = null; 
      this.data = res.json(); 
     }); 
     return this.observable; // <<<< 
    } 
    } 

иначе null будут возвращены и null не обеспечивает метод subscribe.

+0

спасибо! Я также добавляю share() ... любую идею, почему запрос срабатывает 2 раза? Я ожидаю только одного запроса. Я обновляю первый пост журналом. – robert

+1

Наблюдаемый будет выполняться так часто, как он подписан. Я также ожидал, что он будет выполнен только один раз с помощью 'share()'. –