第十二章:创建 awaitTo.ts 工具函数文件

前言:创建此文件的灵感来自于 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]
  }
}
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容