2016-11-01 70 views
2

我有下面的代碼返回一個observable,它檢查this.data是否有效的JSON,否則它會嘗試從url中獲取它。抓取和一切正常。rxjs Observable .map沒有執行

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(); 
    } 
}); 

}

現在在地圖/訂閱觀察者的部分我有以下幾點:

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") 
    } 
); 

我在輸出中看到什麼/控制檯只有「子」(訂閱)功能和「完成」。 .map函數中的console.warn從不執行。

任何幫助,高度讚賞,謝謝提前

+0

再檢查一下這裏http://stackoverflow.com/questions/34671715/angular2-http-get-map-subscribe-and-observable-pattern-basic-understan –

回答

4

地圖是永遠不會被執行,因爲它創建了一個可觀察到的是保持冷(沒有訂閱)。 添加一個空的subscribe(),它應該工作。

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

而且在rxjs調試另一個技巧,如果你想窺視的價值,你可以隨時使用do運營商(而不是你的map)。

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

如何COM你的答案是比我的不同,你的地圖根本不會返回任何東西 –

+0

它堅持原始代碼,只是激活它。然而,由於觀測點變熱,它將通過地圖和打印。如果它是.subscribe(v => console.log(v)),它將顯示一個空值。你的例子賦予了可觀察的$ = observable $ .map(...)它改變了observable,下面的訂閱將失敗。 – Meir

+1

好的,現在謝謝你的工作。我認爲訂閱可觀察的$就足夠了......(/ me Observable n00b):( – pythic

相關問題