使用Observable的HTTP调用未抵达服务器,Promise调用正常,求原因
为啥Observable的请求没发出去?
这问题我之前踩过坑!核心原因是HttpClient返回的Observable是「冷Observable」——简单说就是它不会主动跑起来,必须有人“订阅”它,才会真正触发HTTP请求;而你用.toPromise()的时候,Promise内部会自动帮你完成订阅操作,所以请求能正常打到服务器。
看你代码里的区别:
- 第一个Observable版本:你只调用了
http.post()和.map(),但从头到尾没加.subscribe(),这个Observable就一直处于“待命”状态,根本不会触发请求。 - 第二个Promise版本:
.toPromise()方法内部会自动订阅这个Observable,所以请求被正常发起了。
怎么修复?
给Observable加上.subscribe()就行,比如改成这样:
public placeOrder(order:string) { // 修正后的Observable版本 this.http.post(this.newOrderUrl, {order: order}, this.options) .map((response:Response) => { console.log('new order', response.json()) }) .subscribe(); // 关键!加上这个订阅,请求才会发出去 // Promise版本可以保持不变 this.http.post(this.newOrderUrl, {order: order}, this.options) .toPromise() .then((response:Response) => { console.log('new order', response.json()) }) }
另外提一句:如果你的Angular用的是RxJS 6及以上版本,.map()已经推荐用管道(pipe)包裹的方式来写了,更规范的写法是这样:
// 先导入map操作符 import { map } from 'rxjs/operators'; // ... public placeOrder(order:string) { this.http.post(this.newOrderUrl, {order: order}, this.options) .pipe( map((response: Response) => response.json()) ) .subscribe((data) => { console.log('new order', data); }); }
再啰嗦两句冷Observable的特性
冷Observable的本质就是:只有当存在订阅者时,才会执行内部的逻辑(这里就是发起HTTP请求)。这和Promise完全不一样——Promise一旦创建,就会立刻执行。所以用RxJS处理HTTP请求时,订阅这一步绝对不能忘!
内容的提问来源于stack exchange,提问作者koque
相关产品推荐
相关产品推荐

