Angular http.post 没有 .subscribe 回调

Angular http.post without .subscribe callback

我想知道我是否可以只发出一个 http post 请求而不订阅回调,像这样

 this._http.post('/list/items/update?itemId=' + itemId + "&done=" + done, null);

而不是这个

 this._http.post('/list/items/update?itemId=' + itemId + "&done=" + done, null)
        .subscribe();

我认为你做不到。

http.post(以及获取、放置、删除等)returns 一个冷 Observable,即一个 Observable 用于:

its underlying producer is created and activated during subscription

Source.

这意味着 Observable 表示的功能只能通过 subscribe() 方法激活。

便捷方法也订阅,请参阅 Observable#toPromise() here.

的实现细节

我正在使用到 Promise 的转换(需要 rxjs):

import 'rxjs/add/operator/toPromise';
@Injectable()
export class SomeService {
....
  post(sp: Seatplace, date?: Date) : Promise<any> {
     return this.http.post(
       '/list/items/update?itemId=' + itemId + "&done=" + done, 
        null
     ).toPromise();
  }
}

我也有同样的问题,但后来我发现我实际上并不关心是否有人订阅了 observable。我只想在任何情况下发送 POST 请求。这是我想出的:

postItem(itemData) {
    var observable = this.http.post('/api/items', itemData)
        .map(response => response.json()) // in case you care about returned json       
        .publishReplay(); // would be .publish().replay() in RxJS < v5 I guess
    observable.connect();
    return observable;
}

调用 connect() 后立即发送请求。但是,如果需要,postItem 的调用者仍然可以订阅一个可观察对象。由于使用 publishReplay() 而不仅仅是 publish(),即使在 POST 请求完成后也可以订阅。

就像@picci 点一样,常规可观察对象是冷可观察对象。如果你想提出请求,你可以尝试@lex82 的想法,这里是一个 rxjs 6 草稿:

import { ConnectableObservable } from "rxjs"
import { publish } from "rxjs/operators";

const myConnectableObservable: ConnectableObservable<any> = this._http.post('/list/items/update?itemId=' + itemId + "&done=" + done, null).pipe(publish()) as ConnectableObservable<any>;
myConnectableObservable.connect();

这基本上类似于订阅,但没有进行真正的订阅。

https://blog.danlew.net/2018/09/25/connectable-observables-so-hot-right-now/

您可以像下面这样简单地使用 toPromise 方法:

public getEmployerListFromService() {
    const url = `/list/items/update?itemId=`;
    return this.http.get<any>(url).toPromise().then(response => {
      console.log(response);
    })
  }

并通过以下方式调用此方法:

 this.service.getEmployerListFromService();