http
大约 1 分钟wechat
概述
小程序中使用 wx.request 作为 http 请求
异步请求进入fail的逻辑
不同http请求的不同逻辑
这里介绍最常用的几个异步请求,在小程序中使用 wx.request,web 应用中常用 fetch 和 axios
下面表格的 网络层失败 包含的情况:断网、超时、DNS解析失败、SSL错误等
状态码非2xx 包含的情况:如404、403、500、502 等
| 请求方式 | 环境 | 网络层失败 | 状态码非2xx | 备注 |
|---|---|---|---|---|
| wx.request | 微信小程序 | 进入 fail 回调 | 进入 success 回调(res.statusCode 可拿到) | 最特殊、最反直觉的地方 |
| fetch() | 现代浏览器 | Promise → reject | Promise → resolve(response.ok = false) | 规范故意如此设计 |
| XMLHttpRequest (XHR) | 浏览器(包括老项目) | onreadystatechange + status=0 或 onerror | onreadystatechange + status=404/500 等 | 传统方式,状态码都在 success 逻辑处理 |
| axios (基于 XHR/fetch) | 浏览器 + Node.js | Promise → reject | Promise → reject(默认行为,可配置) | 最符合直觉,多数现代项目用它 |
总结
小程序 wx.request:“有回复就算成功” → success 里必判 statusCode
浏览器 fetch:“有回复就算成功” → then 里必判 response.ok
axios:“非 200 就当失败” → 最省心
fail分支的截断逻辑
wx.request 执行的 http 请求如果 服务端没有回复 就会进入 fail 分支,即使 catch 捕获该异常也会导致中止调用者的后续逻辑。即在 async/await 函数内如下 catch 仍然会导致中止
async formsubmit(){
const res = await this.checkWithinTime$(formData).catch(err => {
// do something
});
}
即使如下 catch 依然会中止调用函数的后续逻辑(checkWithinTime$ 中使用了微信小程序原生的 wx.request)
async formsubmit(){
let res = {};
try{
res = await this.checkWithinTime$(formData);
}catch(err){
// 捕获异常也没用
}
}
