跳至主要內容

http

chanchaw大约 1 分钟wechat

概述

小程序中使用 wx.request 作为 http 请求

异步请求进入fail的逻辑

不同http请求的不同逻辑

这里介绍最常用的几个异步请求,在小程序中使用 wx.requestweb 应用中常用 fetchaxios

下面表格的 网络层失败 包含的情况:断网、超时、DNS解析失败、SSL错误等

状态码非2xx 包含的情况:如404、403、500、502 等

请求方式环境网络层失败状态码非2xx备注
wx.request微信小程序进入 fail 回调进入 success 回调(res.statusCode 可拿到)最特殊、最反直觉的地方
fetch()现代浏览器Promise → rejectPromise → resolve(response.ok = false)规范故意如此设计
XMLHttpRequest (XHR)浏览器(包括老项目)onreadystatechange + status=0 或 onerroronreadystatechange + status=404/500 等传统方式,状态码都在 success 逻辑处理
axios (基于 XHR/fetch)浏览器 + Node.jsPromise → rejectPromise → 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){
        // 捕获异常也没用
    }
}