63

我试图利用 angular2 中的 observables 并且对我为什么应该使用map()over感到困惑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, () => {           
});
4

5 回答 5

93

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

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

subscribe()返回一个Subscription不能订阅的,但是可以用来取消订阅。

map()返回一个Observable可以订阅的。

于 2017-02-20T11:08:35.357 回答
35

将 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,请阅读关于cold-vs-hot-observables的好文档

于 2017-02-20T11:10:34.463 回答
16

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

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

于 2017-02-20T11:08:59.210 回答
2

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

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

于 2018-06-14T06:48:08.803 回答
1

Observables 是流,它们被设计为以功能流的形式编写。您应该使用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);
}
于 2020-02-27T17:47:02.893 回答