uni-app x中使用Promise中reject一个对象出来无论catch中捕获的类型都是Error
uni-app x中使用Promise中reject一个对象出来无论catch中捕获的类型都是Error
开发环境 | 版本号 | 项目创建方式 |
---|---|---|
Windows | Windows 10 | HBuilderX |
家庭中文版19045 | ||
3570 |
产品分类:uniapp/App
PC开发环境操作系统:Windows
手机系统:Android
手机系统版本号:Android 12
手机厂商:模拟器
手机机型:mumu
页面类型:vue
vue版本:vue3
打包方式:云端
示例代码:
export class ResponseError extends Error {
constructor(errCode : number, errMsg : string,data:any|null) {
super(errMsg);
this.errCode = errCode;
this.errMsg = errMsg;
this.data = data
}
/**
* 错误代码。
*/
errCode : number;
/**
* 错误消息
*/
errMsg : string;
data ?: any | null;
}
protected async Request2(apiPath : string, method : "GET" | "POST" | "PUT" | "PATCH" | "DELETE", data : UTSJSONObject | null) : Promise<unknown> {
return new Promise((resolve, reject) => {
// 发送请求
uni.request({
url: this.ServerAddress + apiPath,
data,
method,
success: (res) => {
console.log(res);
if (res.statusCode == 200) {
resolve(res.data)
}
else {;
reject(new ResponseError(res.statusCode,"请求异常",res.data))
}
},
fail(err) {
reject(new ResponseError(err.errCode,err.errMsg,err.data))
}
})
});
}
/**
* 用户登录
*/
public Login(data : UTSJSONObject | null) {
this.Request2("/Token", "POST", {account:'test',password:'kkk123'}).then().catch((res) => {
console.log(res as ResponseError);
})
}
操作步骤:
在uvue页面的onload中调用Login
onLoad() {
let apiRequest : ApiRequest = new ApiRequest();
apiRequest.Login().then()
}
预期结果:
预期:在接口返回的statusCode 不为200代码时,Login方法中通过catch捕获异常,在的console.log中打印ResponseError类型数据包含statusCode,errMsg,data等。
实际结果:
UTSError(name='Error', message='请求异常', cause='null')
`
更多关于uni-app x中使用Promise中reject一个对象出来无论catch中捕获的类型都是Error的实战教程也可以访问 https://www.itying.com/category-93-b0.html
直接访问下errMsg这些属性,是否符合预期
更多关于uni-app x中使用Promise中reject一个对象出来无论catch中捕获的类型都是Error的实战教程也可以访问 https://www.itying.com/category-93-b0.html
用console.log在控制台打印,打印出来的内容起始位置显示UTSError。使用类型断言把catch中捕获的res as ResponseError,在控制台打印还是只有打印出了name, message, cause三个属性。
神奇!直接访问errCode,errMsg这些属性都可以访问到。谢谢!
在uni-app x中,Promise的reject会强制将错误对象转换为Error类型,这是JavaScript/TypeScript的默认行为。即使你抛出自定义错误类型ResponseError,在catch中捕获的也会被包装成UTSError。
解决方案:
- 修改你的代码,在catch中通过error对象的属性来获取原始错误信息:
public Login(data : UTSJSONObject | null) {
this.Request2("/Token", "POST", {account:'test',password:'kkk123'})
.catch((error) => {
console.log({
errCode: error.cause?.errCode || error.errCode,
errMsg: error.message || error.errMsg,
data: error.cause?.data || error.data
});
})
}
- 或者将错误信息作为普通对象返回而不是使用Error对象:
reject({
errCode: res.statusCode,
errMsg: "请求异常",
data: res.data
})