uni-helper / uni-network

为 uni-app 打造的基于 Promise 的 HTTP 客户端
https://uni-network.netlify.app
MIT License
76 stars 8 forks source link

[RFC] 更改默认适配器的行为 #49

Open ModyQyW opened 5 months ago

ModyQyW commented 5 months ago

背景

目前,默认适配器会在 uni.request/uni.uploadFile/uni.downloadFile 的 fail 回调中设置 response 而不是调用 reject 抛出 UnError,可见:

因此,在后续操作进入 settle 方法后,由于不存在 status,所以会被 resolve,可见:

最后导致用户可能需要在 response 中处理 error。

一个更详细的例子如下,可以通过修改 playground 得到相同的结果:

// 设置很短的超时时间
un.get('https://jsonplaceholder.typicode.com/todos', { timeout: 10 })
  .then((data) => {
    console.log('data', data);
  })
  .catch((error) => {
    console.log('error', error);
  });

在 axios v1.7.2 xhr 和 fetch 两个 adapter 中,超时将得到 AxiosError 相关的输出。

https://github.com/axios/axios/blob/v1.x/lib/adapters/xhr.js#L110

https://github.com/axios/axios/blob/v1.x/lib/adapters/fetch.js#L217-L225

但在这里将得到 data 相关的输出:data {errMsg: "request:fail timeout", errno: undefined},这极有可能会造成用户侧的困扰:为什么不是 error 呢?

提议

修改三个默认适配器,在 fail 回调中调用 reject 抛出 UnError,使得相关行为与 axios 保持一致。该修改属于破坏性修复,考虑纳入 v0.19 或 v1。

额外上下文

最初想法源于 https://github.com/Lin-w-b ,非常感谢与我的沟通。