rxjs Observable .map没有执行

时间:2016-11-01 10:00:04

标签: angular typescript rxjs observable

我有以下代码返回一个observable,它会检查this.data是否是有效的JSON,否则它会尝试从url中获取它。提取和一切正常。

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

}

现在,在观察者的map / subscribe部分,我有以下内容:

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

我在输出/控制台中看到的只是“IN SUB”(订阅)功能和“COMPLETE”。从不执行.map函数中的console.warn。

任何帮助都非常感谢,提前感谢

2 个答案:

答案 0 :(得分:9)

地图永远不会执行,因为它会创建一个保持冷(无订阅)的可观察对象。 添加一个空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 ...)

答案 1 :(得分:0)

rxjs发生了很大变化。 Angular 2(8)与AngularJS完全不同。

从rxjs版本6开始,您需要使用导入

import {map} from 'rxjs/operators';

,并在您的代码中将其包含在pipe中,例如:

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

希望这会有所帮助!