2016-11-01 71 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

相关问题