前言:创建此文件的灵感来自于 await-to-js 插件,主要用于简化 await 的错误处理方式;
一、创建 src/utils/awaitTo.ts 文件,并添加 to(promise, errorExt) 函数
// src/utils/awaitTo.ts
/**
* @param { Promise } promise
* @param {Record<string, any>} errorExt 可以传递给 Error 对象的其他信息
* @return { Promise }
*/
export default async function to<D, E = Error>(promise: Promise<D>, errorExt?: object): Promise<[E, undefined] | [null, D]> {
try {
const data = await promise
const result: [null, D] = [null, data]
return result
}
catch (err) {
if (errorExt) {
const parsedError = Object.assign({}, err, errorExt)
return [parsedError, undefined]
}
return [err, undefined]
}
}
二、调用方式
interface ResDataModel {
test: number;
}
const promise = Promise.resolve({test: 123});
const [err, data] = await to<ResDataModel>(promise);
if (err) {
console.log('请求失败,打印错误信息');
return;
}
// 请求成功,打印 promise 返回的数据
console.log(data);
注意:这里可以根据项目情况进行如下扩展
// src/utils/awaitTo.ts
/**
* @param { Promise } promise
* @param {Record<string, any>} errorExt 可以传递给 Error 对象的其他信息
* @return { Promise }
*/
// 假设接口返回的数据结构为 ResponseModel
interface ResponseModel<D> {
data: D
/**
* 0: 成功; -1: 失败
*/
code: number
message: string
}
export default async function to<D, E = Error>(
promise: Promise<ResponseModel<D>>,
errorExt?: object,
): Promise<[E, undefined, undefined] | [null, undefined, D] | [null, Pick<ResponseModel<D>, 'code' | 'message'>, D]> {
try {
const data: ResponseModel<D> = await promise
switch (data.code) {
case 0:
return [null, undefined, data.data]
case -1:
return [null, { code: data.code, message: data.message }, data.data]
default:
return [null, { code: data.code, message: data.message }, data.data]
}
}
catch (err) {
if (errorExt) {
const parsedError = Object.assign({}, err, errorExt)
return [parsedError, undefined, undefined]
}
return [err, undefined, undefined]
}
}