问题 Angular http.post没有.subscribe回调


我想知道我是否可以制作一个http 发布请求而不订阅回调,像这样的东西

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

而不是这个

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

12704
2017-12-23 06:09


起源



答案:


我认为你不能。

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

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


6
2017-12-23 06:33





我有同样的问题,但后来我发现我真的不在乎是否有人订阅了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请求完成后也可以订阅。


4
2018-05-08 11:48



这引发了 error TS2339: Property 'json' does not exist on type 'Object'. - JacobIRR


答案:


我认为你不能。

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

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


6
2017-12-23 06:33





我有同样的问题,但后来我发现我真的不在乎是否有人订阅了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请求完成后也可以订阅。


4
2018-05-08 11:48



这引发了 error TS2339: Property 'json' does not exist on type 'Object'. - JacobIRR


我正在使用转换为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
2017-12-23 06:35