Angular http.post without .subscribe callback

后端 未结 5 2138
野的像风
野的像风 2020-12-05 23:56

I\'m wondering if I can make just a http post request without subscribing on callbacks, something like this

 this._http.post(\'/list/items/u         


        
相关标签:
5条回答
  • 2020-12-06 00:02

    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();
    

    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/

    0 讨论(0)
  • 2020-12-06 00:08

    I do not think you can.

    http.post (and get, put, delete, etc) returns a cold Observable, i.e. an Observable for which:

    its underlying producer is created and activated during subscription

    Source.

    This means the function represented by the Observable is activated only with the subscribe() method.

    0 讨论(0)
  • 2020-12-06 00:08

    You can simply use toPromise method like below:

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

    And Call this method by :

     this.service.getEmployerListFromService();
    
    0 讨论(0)
  • 2020-12-06 00:10

    I'm using conversion to Promise (requires 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();
      }
    }
    
    0 讨论(0)
  • 2020-12-06 00:21

    I had the same question but then I figured out that I actually don't care if someone subscribes to the observable. I just want the POST request sent in any case. This is what I came up with:

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

    The request is sent as soon as connect() is called. However, there is still an observable that the caller of postItem can subscribe to if required. Since publishReplay() is used instead of just publish(), subscribing is possible even after the POST request completed.

    0 讨论(0)
提交回复
热议问题