使用 Angular 2 http.post 而不订阅?还是我想错了?
Using an Angular 2 http.post without subscribing? Or am I thinking of it wrong?
有没有办法不订阅就告诉服务器更新数据?跳过 return 语句和订阅似乎会使 http 调用无效。
就我而言,我的数据库人员创建了一堆 return 什么都没有的存储过程,有时我想在我的服务中做一些像这样简单的事情:
public setItem(item: IRequestItem) {
this.http.post('api/items', item);
}
并在我的组件中这样调用它:
save() {
var comp = this;
this.items.forEach(function(item) {
comp.service.setItem(item)
});
}
相反,我必须在服务中做这样的事情:
public setItem(item: IRequestItem) {
return this.http.post('api/items', item);
}
然后在组件中这样调用:
save() {
var comp = this;
this.items.forEach(function(item) {
comp.service.setItem(item).subscribe(r => console.log(r));
});
}
其中 return 很多这样的:
Response {_body: "", status: 204, ok: true, statusText: "No Content", headers: Headers…}
_body : ""
headers : Headers
ok : true
status : 204
statusText : "No Content"
type : 2
url : "http://localhost:56018/api/items"
__proto__ : Object
我只是在学习所以也许我看错了。我能否解释 Response 对象中的某些内容,让我知道操作是失败还是成功?或者是否有另一种语法只是 return 成功或失败而不是令人困惑的 "No Content" 响应?
为了触发请求,你需要调用subscribe
但你不需要return从服务中观察到的请求并从组件中调用它,你可以从调用订阅在服务中。
setItem(item: RequestItem) {
this.http.post('api/items', item)
.subscribe({ error: e => console.error(e) });
}
现在在上面,服务将立即return,在请求完成之前,但是请求将被发出并且任何错误都会从服务中记录下来。
http.post
返回的 Observable
是一个“冷”可观察对象:除非有人订阅它,否则它不会做任何事情。
在 RXJS 7 中,您可以使用 ReplaySubject
和 connectable
将这种冷的可观察对象变成“热”/可连接的可观察对象。如果有人订阅它,它就会得到结果。如果没有人订阅它,它仍然会被调用。将此实用程序函数添加到您的代码中:
private wrapObservable<T>(coldObservable: Observable<T>): Observable<T> {
const observable = connectable(
coldObservable,
{
connector: () => new ReplaySubject<T>(),
resetOnDisconnect: false
}
);
observable.connect();
return observable;
}
然后用它包裹http.post
:
public setItem(item: IRequestItem): Observable<IItemSetResult> {
return this.wrapObservable(this.http.post('api/items', item));
}
现在您可以在没有 .subscribe()
的情况下调用 setItem
- 它会起作用:
save() {
var comp = this;
this.items.forEach(function(item) {
comp.service.setItem(item);
});
}
如果您需要结果,可以订阅包装的可观察对象:
save() {
var comp = this;
this.items.forEach(function(item) {
comp.service.setItem(item)
.subscribe(itemSetResult =>
console.log(`Server returned result: ${itemSetResult}`)
);
});
}
有没有办法不订阅就告诉服务器更新数据?跳过 return 语句和订阅似乎会使 http 调用无效。
就我而言,我的数据库人员创建了一堆 return 什么都没有的存储过程,有时我想在我的服务中做一些像这样简单的事情:
public setItem(item: IRequestItem) {
this.http.post('api/items', item);
}
并在我的组件中这样调用它:
save() {
var comp = this;
this.items.forEach(function(item) {
comp.service.setItem(item)
});
}
相反,我必须在服务中做这样的事情:
public setItem(item: IRequestItem) {
return this.http.post('api/items', item);
}
然后在组件中这样调用:
save() {
var comp = this;
this.items.forEach(function(item) {
comp.service.setItem(item).subscribe(r => console.log(r));
});
}
其中 return 很多这样的:
Response {_body: "", status: 204, ok: true, statusText: "No Content", headers: Headers…}
_body : ""
headers : Headers
ok : true
status : 204
statusText : "No Content"
type : 2
url : "http://localhost:56018/api/items"
__proto__ : Object
我只是在学习所以也许我看错了。我能否解释 Response 对象中的某些内容,让我知道操作是失败还是成功?或者是否有另一种语法只是 return 成功或失败而不是令人困惑的 "No Content" 响应?
为了触发请求,你需要调用subscribe
但你不需要return从服务中观察到的请求并从组件中调用它,你可以从调用订阅在服务中。
setItem(item: RequestItem) {
this.http.post('api/items', item)
.subscribe({ error: e => console.error(e) });
}
现在在上面,服务将立即return,在请求完成之前,但是请求将被发出并且任何错误都会从服务中记录下来。
http.post
返回的 Observable
是一个“冷”可观察对象:除非有人订阅它,否则它不会做任何事情。
在 RXJS 7 中,您可以使用 ReplaySubject
和 connectable
将这种冷的可观察对象变成“热”/可连接的可观察对象。如果有人订阅它,它就会得到结果。如果没有人订阅它,它仍然会被调用。将此实用程序函数添加到您的代码中:
private wrapObservable<T>(coldObservable: Observable<T>): Observable<T> {
const observable = connectable(
coldObservable,
{
connector: () => new ReplaySubject<T>(),
resetOnDisconnect: false
}
);
observable.connect();
return observable;
}
然后用它包裹http.post
:
public setItem(item: IRequestItem): Observable<IItemSetResult> {
return this.wrapObservable(this.http.post('api/items', item));
}
现在您可以在没有 .subscribe()
的情况下调用 setItem
- 它会起作用:
save() {
var comp = this;
this.items.forEach(function(item) {
comp.service.setItem(item);
});
}
如果您需要结果,可以订阅包装的可观察对象:
save() {
var comp = this;
this.items.forEach(function(item) {
comp.service.setItem(item)
.subscribe(itemSetResult =>
console.log(`Server returned result: ${itemSetResult}`)
);
});
}