2016-07-14 4 views
0

EDIT: Ich habe dieses Problem gelöst. Bitte sehen Sie meine Antwort unten, da es jemandem helfen kann. Wenn Sie eine bessere Antwort wissen, bitte posten Sie es! :)Angular 2 Http, RxJS Kann die Eigenschaft "unsubscribe" von undefined nicht lesen

Ich arbeite an einem Angular 2 Universal API-Cache und haben eine ApiService wie folgt aus:

import {Http} from '@angular/core'; 

export class ApiService { 
    constructor(private http: Http, private cache: CacheService) 
} 

get(url) { 
    if (cache_data) { 
     //Create new observable from scratch 
     return new Observable(sub => { 
      sub.next(cache_data); 
     }); 
    } else { 
     //Use Angular 2's Http service, which creates an Observable for me 
     return this.http.get(url) 
      .map(res => res.json()) 
      .catch(err => throw err); 
    } 
} 

In einem anderen Dienst, wo ich ihn abonnieren, ich habe:

import {ApiService} from './api/api.service'; 

export class ConsumerService { 
    constructor(apiService: ApiService) {} 
    let sub = this.apiService.get('www.example.com') 
     .subscribe(data => { 
      console.log(data); 
      sub.unsubscribe(); 
     }) 
} 

Wenn sich die angeforderten Daten nicht im Cache befinden und der Server eine HTTP-Anforderung dafür erstellen muss, funktioniert der obige Code einwandfrei. Wenn Daten in den Cache ist, erhalte ich jedoch die folgende Fehlermeldung: Cannot read property 'unsubscribe' of undefined Nicht definiert bezieht sich natürlich auf meine Variable sub.

Mein erster Gedanke ist, dass die Art der Observable, die ich im Cache vs Angular 2 Http Observable erstellen, sind unterschiedlich, und damit einen Fehler zu erstellen. Ich habe versucht, das zu testen, aber ich habe keine Möglichkeit, es zu bestätigen. Jede Hilfe wird geschätzt.

+0

Warum rufen Sie im 'next' Block' Abmelden' an? Auch gibt es bereits eine Erstellungsmethode für einzelne Objekte 'Observable.of (cached_data)'. – paulpdaniels

+0

Sie können auch 'subcomplete()' nach 'sub.next()' aufrufen, um die Observable zu vervollständigen, die sich nach Abschluss automatisch austragen. – tomastrajan

Antwort

1

Ich entschied mich, dies zu beheben, indem ich mich an den asynchronen Stil meiner Anwendung hielt. Anstatt meine cache_data nur in einem Observable zurückzugeben, verpacke ich sie zuerst in ein Promise, das dann in eine Observable verpackt wird.

let cacheFromPromise = new Promise(resolve => { 
    resolve(cache_data); 
}); 

return Observable.fromPromise(cacheFromPromise); 

Alles funktioniert jetzt perfekt.

+0

Wissen Sie, warum das passiert? Ich stoße genau auf das gleiche Problem und mache das, was du getan hast. Wenn ich ein Promise in ein Observable verwandle, kann ich 'unsubscribe()' darauf aufrufen. –

+0

@KaMok Das scheint zu passieren, wenn das Observable nichts zurückgibt, also ist die 'sub'-Variable in meinem obigen Beispiel noch nicht definiert. Um es in eine Zusage _forces_ es async zu wickeln, also geben "sub" Zeit, um einen Wert zugewiesen – yazeedb

+0

Ich verwendet 'Observable.of (true)', sowie 'Observable.create()' mit wie 3 Zeilen von ' .next (true) ', was' true' zurückgibt. –

Verwandte Themen