我们为什么要在Angular中使用subscribe()而不是map()?

时间:2017-02-20 11:00:47

标签: angular typescript rxjs observable angular-observable

我正在尝试利用angular2中的observable,并对我为什么要使用map()而不是subscribe()感到困惑。 假设我从webApi获取值,比如

  this.http.get('http://172.17.40.41:8089/api/Master/GetAllCountry')

现在使用subscribe(success, error, complete)我可以获得成功回调的所有值,并且我可以在完整回调上返回值。如果我可以完成所有这些功能,那么map()的需求是什么?它有什么优势吗?

简而言之,为什么人们应该这样写

this.http.get('http://172.17.40.41:8089/api/Master/GetAllCountry')
    .map(r=>{})
    .subscribe(value => {
    }, error => error, () => {
});

当他们可以在没有地图功能的情况下简单地写这个:

this.http.get('http://172.17.40.41:8089/api/Master/GetAllCountry')
    .subscribe(value => {        
    }, error => error, () => {           
});

5 个答案:

答案 0 :(得分:72)

如果您想返回Observable其他一些可以订阅的代码,但您仍想在当前方法中操纵数据事件,请使用map

observable的实际用户需要subscribe(),因为没有subscribe(),observable根本不会被执行。 (forEach()toArray(),可能还有其他人可以执行observable而不是subscribe()

subscribe()会返回无法订阅的Subscription,但可以用来取消订阅。

map()会返回可以订阅的Observable

答案 1 :(得分:30)

将地图视为转换响应的中间件。

this.http.get('http://172.17.40.41:8089/api/Master/GetAllCountry')
.map(r=>r.json())
 .subscribe(result => {
              // here result would have json object that was parsed by map handler...
            },failurCallback,completeCallback)

subscribe用于调用observable,请阅读cold-vs-hot-observables上的好文档

答案 2 :(得分:11)

您需要subscribe来运行异步请求。如果您只设置map - 则不会触发任何请求。你可以查一下。

使用map预处理数据的良好做法,因为许多订阅者可以使用您的结果。因此,不是为每个客户端(订户)添加预处理,而是可以为所有客户准备单个数据模式的单个输出。

答案 3 :(得分:2)

.map()是一个rxjs运算符,它会以[]形式显示数组.json()形式的结果

https://www.learnrxjs.io/operators/transformation/map.html

答案 4 :(得分:0)

可观察对象是流,它们被设计为以功能流编写。您应该使用 RxJS 操作,因为这是对可观察对象实施订阅的“ 功能”方法。通常,当我们在Observable流之外获取数据时会发生这种情况。

这是一个异步操作,必须同步进行。

bad_example() {
  let id;
  this.obs.subscribe(param => id = param['id']);
    this.get(id).subscribe(elem => this.elem = elem);
}

这是一个异步操作,可以正常工作。 (作为流)

good_example() {
  this.obs
    .map(param => param['id'])
    .switchMap(id => return this.get(id))
    .subscribe(elem => this.elem = elem);
}