为什么Angular的http.post方法在多次成功运行后无任何响应?
根因分析与解决方案
同域名并发连接占满(最高概率)
安卓WebView对HTTP/1.1协议的同域名默认最大并发请求数为6个,若前5次请求外还有1个请求一直挂起没有结束(服务端未返回响应也未关闭连接),就会占满所有连接槽,后续请求只能排队无法发出,也不会触发任何回调。
修复方案:给请求增加超时主动释放连接,示例代码如下:import { timeout } from 'rxjs/operators'; console.log("Calling post..."); this.http.post<any>( `my-url`, { // 传给服务端的参数 }, { headers: { /* 自定义请求头 */ }, } ) .pipe(timeout(10000)) // 设置10秒超时,超时后主动断开连接触发error回调 .subscribe( (data) => { console.log("Received data!"); /* 处理返回数据 */ }, (error) => { console.error("An error happened: " + error); }, () => { console.log("Finished..."); });HTTP拦截器逻辑故障
如果项目配置了全局Angular HTTP拦截器,检查拦截器内是否存在逻辑分支未调用next.handle(request)传递请求。如果存在遗漏的分支,请求会直接卡在拦截器层,不会向外发出,也不会触发回调。
排查方法:在拦截器所有逻辑分支打印日志,确认每次请求都能执行到next.handle方法。订阅未正确释放导致流阻塞
虽然Angular HttpClient的请求在完成后会自动销毁订阅,但如果页面多次进出、重复发起请求时没有取消上一次未完成的订阅,也可能出现RxJS流阻塞的情况,导致新请求无法发起。
修复方案:页面销毁或发起新请求前主动取消未完成的订阅,示例代码如下:import { Subscription } from 'rxjs'; // 页面类内定义变量存储订阅实例 private requestSub: Subscription | null = null; sendRequest() { // 发起新请求前先取消上一次未完成的请求 if (this.requestSub) { this.requestSub.unsubscribe(); } this.requestSub = this.http.post(/* 请求参数 */) .pipe(timeout(10000)) .subscribe( // 回调逻辑 ); } // 页面离开时销毁所有订阅 ionViewWillLeave() { if (this.requestSub) { this.requestSub.unsubscribe(); this.requestSub = null; } }原生HTTP插件队列限制
如果你使用的是Cordova原生HTTP插件而非Angular自带的HttpClient,可尝试重置插件配置、清理cookie缓存排查是否是插件队列卡死导致的问题,也可临时切换到Angular HttpClient验证是否为插件本身故障。
内容的提问来源于stack exchange,提问作者SZILÁRD ÁDÁM
相关产品推荐
相关产品推荐

