Angular http.post没有.subscribe回调

Vnu*_*uuk 19 typescript angular2-services angular

我想知道我是否可以在没有订阅回调的情况下制作一个http post请求,就像这样

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

而不是这个

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

Pic*_*cci 13

我认为你不能.

http.post(以及get,put,delete等)返回一个冷Observable,即一个Observable,其"在订阅期间创建并激活其底层生成器"(https://medium.com/@benlesh/hot-vs- cold-observables-f8094ed53339#.tofgfsou4).

这意味着Observable表示的函数仅使用subscribe方法激活.


lex*_*x82 8

我有同样的问题,但后来我发现我真的不在乎是否有人订阅了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;
}
Run Code Online (Sandbox Code Playgroud)

connect()调用后立即发送请求.但是,仍有一个可观察到的调用者postItem可以根据需要订阅.因为publishReplay()使用而不仅仅是publish(),即使在POST请求完成之后也可以订阅.

  • 如果其他人想在RxJS 6中使用此方法,则必须强制转换`Observable`进行连接:`const observable = this.http.post &lt;T&gt;('/ api / items',itemData).pipe( publishReplay()); (可观察为ConnectedObservable &lt;T&gt;)。connect(); 可观察到的回报; (2认同)

2op*_*pin 7

我正在使用转换为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();
  }
}
Run Code Online (Sandbox Code Playgroud)


小智 5

Just like @picci points, regular observables are cold observables. If you want to make the request you can try @lex82 idea, here is a rxjs 6 draft:

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();
Run Code Online (Sandbox Code Playgroud)

which basically is like a subscribe but without to make a real subscription.

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