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/