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

Ответ 1

Я не думаю, что вы можете.

http.post (и get, put, delete и т.д.) возвращает холодную наблюдаемую, то есть наблюдаемую, для которой:

его основной производитель создается и активируется во время подписки

Источник

Это означает, что функция, представленная в Observable, активируется только с помощью метода subscribe().

Ответ 2

У меня был тот же вопрос, но потом я понял, что мне действительно все равно, если кто-то подписался на наблюдаемый. Я просто хочу, чтобы запрос 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.

Ответ 3

Я использую преобразование в 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();
  }
}

Ответ 4

Как и точки @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/