为什么我们应该在 Angular 中使用 subscribe() 而不是 map()?
why should we use subscribe() over map() in Angular?
我正在尝试利用 angular2 中的 observables,但对为什么我应该使用 map()
而不是 subscribe()
感到困惑。
假设我从 webApi 获取值,像这样
this.http.get('http://172.17.40.41:8089/api/Master/GetAllCountry')
现在使用 subscribe(success, error, complete)
我可以获得成功回调的所有值,我可以 return 完成回调的值。如果我可以完成所有这些功能,那么 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, () => {
});
如果你想return一个Observable
一些其他代码可以订阅,但你仍然想在当前方法中操作数据事件,请使用map
。
observable 的实际用户需要 subscribe()
,因为如果没有 subscribe()
,observable 根本不会被执行。 (forEach()
或 toArray()
可能其他人也可以执行 observable 而不是 subscribe()
)
subscribe()
return一个Subscription
不能订阅,但是可以用来取消订阅
map()
return 一个 Observable
可以订阅。
您需要 subscribe
到 运行 您的异步请求。如果您只是设置 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,请阅读 cold-vs-hot-observables
上的好文档
.map()
是一个 rxjs 运算符,它将以数组 []
形式显示结果 .json()
形式
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);
}
我正在尝试利用 angular2 中的 observables,但对为什么我应该使用 map()
而不是 subscribe()
感到困惑。
假设我从 webApi 获取值,像这样
this.http.get('http://172.17.40.41:8089/api/Master/GetAllCountry')
现在使用 subscribe(success, error, complete)
我可以获得成功回调的所有值,我可以 return 完成回调的值。如果我可以完成所有这些功能,那么 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, () => {
});
如果你想return一个Observable
一些其他代码可以订阅,但你仍然想在当前方法中操作数据事件,请使用map
。
observable 的实际用户需要 subscribe()
,因为如果没有 subscribe()
,observable 根本不会被执行。 (forEach()
或 toArray()
可能其他人也可以执行 observable 而不是 subscribe()
)
subscribe()
return一个Subscription
不能订阅,但是可以用来取消订阅
map()
return 一个 Observable
可以订阅。
您需要 subscribe
到 运行 您的异步请求。如果您只是设置 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,请阅读 cold-vs-hot-observables
上的好文档.map()
是一个 rxjs 运算符,它将以数组 []
形式显示结果 .json()
形式
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);
}