Angular http.post没有.subscribe回调

时间:2016-12-23 06:09:33

标签: angular typescript angular2-services

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

def send_to_client(...):
    Group.send(...)
    response_msg = #response message from client

而不是

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

5 个答案:

答案 0 :(得分:11)

我认为你不能。

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

这意味着Observable代表的函数仅使用subscribe()方法激活。

答案 1 :(得分:6)

我有同样的问题,但后来我发现,如果有人订阅了观察者,我实际上并不在乎。我只想要在任何情况下发送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请求完成后也可以进行订阅。

答案 2 :(得分:4)

我使用转换为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();
  }
}

答案 3 :(得分:3)

就像@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/

答案 4 :(得分:0)

您可以简单地使用toPromise方法,如下所示:

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

然后通过以下方式调用此方法:

 this.service.getEmployerListFromService();