使用 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 中,您可以使用 ReplaySubjectconnectable 将这种冷的可观察对象变成“热”/可连接的可观察对象。如果有人订阅它,它就会得到结果。如果没有人订阅它,它仍然会被调用。将此实用程序函数添加到您的代码中:

  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}`)
            );
    });
}