我想知道我是否可以在不订阅回调的情况下制作一个http 帖子请求,就像这样
def send_to_client(...):
Group.send(...)
response_msg = #response message from client
而不是
this._http.post('/list/items/update?itemId=' + itemId + "&done=" + done, null);
答案 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();