一、前景
目前async await可以精简的解决回调地狱问题,但是使用时需要用 try + catch 来捕获错误,这样代码看起来依旧是有点繁琐,await-to-js恰好可以解决这一问题
二、使用对比
- async await写法
async function getList(){
try{
const res = await requestFunc()
......
}catch(err){
......
}
}
- await-to-js写法
import to from 'await-to-js';
async function getList(){
const [err res] = await to(requestFunc())
if(err){
throw new Error(err)
}
......
}
三、源码分析
- 源码链接:https://github.com/scopsy/await-to-js
- 源码核心:
//入参有2个,异步的promise和自定义错误信息errorExt
//返回promisse数组,数组两个元素,第一个是catch的错误信息,第二个是异步回调then的结果
export function to<T, U = Error> (
promise: Promise<T>,
errorExt?: object
): Promise<[U, undefined] | [null, T]> {
return promise
.then<[null, T]>((data: T) => [null, data])
.catch<[U, undefined]>((err: U) => {
if (errorExt) {
const parsedError = Object.assign({}, err, errorExt);
return [parsedError, undefined];
}
return [err, undefined];
});
}
export default to;
- 代码逻辑:
- 无论成功还是失败都会返回一个promise,promise里返回的是一个数组,第一个元素是错误信息,第二个元素正确结果
- 成功:第一个元素为null
- 失败:第二个元素为undefined
- 第二个入参errorExt是自定义错误信息,必须是object,失败时会拼接catch的错误信息一起返回