2016-11-01 5 views
2

Ich habe den folgenden Code, der eine Observable zurückgibt, überprüft es, ob das this.data JSON gültig ist, andernfalls versucht es, es von URL abzurufen. Das Holen und alles funktioniert.rxjs Observable .map nicht ausgeführt

load():Observable<IStandardListOutput[]> { 

return Observable.create(observer => { 

    if (this.needsFetch) { 
    var data; 
    this.http.get(this.data) 
     .map(res => { 
     var result = res.text(); 
     // console.log(result); 
     try { 
      data = JSON.parse(result) 
     } catch (e) { 
      return Observable.of([{error:"ERROR LOADING JSON: " + this.data}]); 
     } 
     return data; 
     }).subscribe(res => { 
     observer.next(this._parse(res)); 
     observer.complete(); 
     }); 
    }else { 
    observer.next(this._parse(this.data)); 
    observer.complete(); 
    } 
}); 

}

Jetzt in der Karte/abonnieren Teil des Beobachters habe ich folgendes:

let observable$ = this.loader.load(); // <-- load method above 
observable$.map(res => { 
    console.warn ("IN MAP: " + JSON.stringify(res)); 
}); 

observable$.subscribe(res=> { 
    console.log("IN SUB: " + JSON.stringify(res)); 
    }, 
    err => { 
    console.log(JSON.stringify(err)) 
    }, 
() => { 
    console.info("COMPLETE") 
    } 
); 

Was ich in der Ausgabe sehen/Konsole ist nur die "IN SUB" (abonnieren) und ein "COMPLETE". Die console.warn in der Map-Funktion wird nie ausgeführt.

Jede Hilfe ist sehr geschätzt, Dank im Voraus

+0

Chech hier in http://stackoverflow.com/questions/34671715/angular2-http-get-map-subscribe-and-observable-pattern-basic-understan –

Antwort

4

Die Karte nie, weil es eine beobachtbare schafft ausgeführt wird, die kalt (kein Abo) bleibt. Fügen Sie eine leere subscribe() hinzu und es sollte funktionieren.

observable$.map(res => { 
    console.warn ("IN MAP: " + JSON.stringify(res)); 
}).subscribe(); 

Und noch ein Tipp auf rxjs Debuggen, wenn Sie in den Wert spähen möchten, können Sie immer den do Operator (statt Ihrer map).

observable$ 
    .do((v) => console.log('debug point: ', v)) // <-- this is the addition. 
    .subscribe(...your original handlers go here ...) 
+0

Wie com Ihre Antwort ist anders als meine, Ihre Karte gibt überhaupt nichts zurück –

+0

Es wurde mit dem ursprünglichen Code geklebt, nur aktiviert es. Da das Observable jedoch heiß wird, wird es durch die Karte gehen und drucken. Wenn es .subscribe (v => console.log (v)) wäre, würde es einen leeren Wert darstellen. Ihr Beispiel weist beobachtbare $ = beobachtbare $ .map (...) zu, es ändert das beobachtbare und das folgende Abonnement wird fehlschlagen. – Meir

+1

okay, danke jetzt funktioniert es. Ich dachte, das Subskribieren der beobachtbaren $ war genug ... (/ mich Observable n00b) :( – pythic

Verwandte Themen