优美的await-to-js

338 阅读1分钟

一、前景

目前async await可以精简的解决回调地狱问题,但是使用时需要用 try + catch 来捕获错误,这样代码看起来依旧是有点繁琐,await-to-js恰好可以解决这一问题

二、使用对比

  1.  async await写法
async function getList(){
    try{
        const res = await requestFunc()
        ......
    }catch(err){
    ......
    }
}

  1. await-to-js写法
import to from 'await-to-js';
async function getList(){
    const [err res] = await to(requestFunc())
    if(err){
        throw new Error(err)
    }
    ......
}

三、源码分析

1. 源码链接:github.com/scopsy/awai…

2. 源码核心:

//入参有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;

3. 代码逻辑:

  • 无论成功还是失败都会返回一个promise,promise里返回的是一个数组,第一个元素是错误信息,第二个元素正确结果

  •  成功:第一个元素为null

  •  失败:第二个元素为undefined

  •  第二个入参errorExt是自定义错误信息,必须是object,失败时会拼接catch的错误信息一起返回