await-to-js源码解析

68 阅读1分钟

作用: 代替try catch

不使用此插件

async function getList (){
  try{
    loading = true;
    let res = await request('api/getList')
    list = res.data
    loading = false;
  }(err){
    loading = false;
    throw Error('api/getList错误:', err)
  }
}

使用此插件

async function getList (){
  loading = true;
  let req = request('api/getList')
  let [err, res] = await to(req)
  loading = false;
  if(err){
    return throw Error('api/getList错误:', err)
  }
  list = res.data
}

源码解析

将then和catch做了一次包装,返回值一定是[null, data] 或 [parsedError, undefined]。 catch 时可加入自定义erorr

/**
 * @param { Promise } promise
 * @param { Object= } errorExt - Additional Information you can pass to the err object
 * @return { Promise }
 */
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;