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

为什么我们要在Angular中使用subscribe()而不是map()?,angular,typescript,rxjs,observable,angular-observable,Angular,Typescript,Rxjs,Observable,Angular Observable,我试图利用angular2中的可观测值,但我不明白为什么我应该使用map()而不是subscribe()。 假设我从webApi获取值,如下所示 this.http.get('http://172.17.40.41:8089/api/Master/GetAllCountry') 现在使用subscribe(success,error,complete)我可以获得成功回调上的所有值,并且可以返回完整回调上的值。如果我能完成所有这些功能,那么map()需要什么?这有什么好处吗 简而言之,为什么

我试图利用angular2中的可观测值,但我不明白为什么我应该使用
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, () => {
});
当他们不需要map函数就可以简单地写这篇文章时:

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

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

可观察对象的实际用户需要
subscribe()
,因为如果没有
subscribe()
,可观察对象将根本无法执行。(
forEach()
toArray()
和其他人可能也会执行可观察的,而不是
subscribe()

subscribe()
返回无法订阅的
订阅,但可用于取消订阅


map()。如果只设置
map
,则不会触发任何请求。你可以查一下


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

将map视为转换响应的中间件

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,请阅读
上的好文档。map()
是一个rxjs运算符,它将以数组
[]
形式或
.json()
形式显示结果


可观测数据是流,它们被设计成写在功能流中。您应该使用RxJS操作,因为它是实现可观测子部分的“功能”方式。通常,当我们在可观察流之外获取数据时,就会发生这种情况

这是一个强制同步工作的异步操作

bad_example() {
  let id;
  this.obs.subscribe(param => id = param['id']);
    this.get(id).subscribe(elem => this.elem = elem);
}
这是一个异步操作,按预期工作。 (如溪流)


我已经更新了我的问题,请看一下。map(r=>{})将导致未定义的值。如果你在寻找一个合理的答案,请以合理的方式解释你的情况。
good_example() {
  this.obs
    .map(param => param['id'])
    .switchMap(id => return this.get(id))
    .subscribe(elem => this.elem = elem);
}