await-to-js让你的async/await更简洁

384 阅读1分钟

await-to-js是一个async/await包装器,便于错误处理。

通常情况下,我们在使用async/await时,需要使用try/catch来捕获错误,但是这样会产生额外的try/catch的代码, await-to-js可以取消async/await的try/catch,让代码更加简洁。

try/catch

    function requestApi() {
      return Promise.reject("登录成功");
    }

    async function login() {
      try {
        const resp = await requestApi();
        // your code
      } catch (error) {
        // 错误处理
      }
    }

使用包装器

    async function login() {
      const [err, resp] = await requestApi();
      if (err) {
        // 错误处理
      } else {
        // your code
      }
    }

await-to-js的源码也很简单,就是一个简单的函数,使用错误优先机制,总是返回[err, data]的形式,另外还接收一个可选的errorExt参数,用于扩展错误信息。

await-to-js源码

/**
 * @param { Promise } promise
 * @param { Object= } errorExt - Additional Information you can pass to the err object
 * @return { Promise }
 */
export function to(promise, errorExt) {
    return promise
        .then(function (data) { return [null, data]; })
        .catch(function (err) {
        if (errorExt) {
            var parsedError = Object.assign({}, err, errorExt);
            return [parsedError, undefined];
        }
        return [err, undefined];
    });
}
export default to;
//# sourceMappingURL=await-to-js.js.map

ts版本:

interface Error {
  stack?: string;
}

function to<T, U = Error>(
  promise: Promise<T>,
  errorExt?: object
): Promise<[U, undefined] | [null , T]> {
  return promise
    .then<[null, T]>(function (data) {
      return [null, data];
    })
    .catch<[U, undefined]>(function (err:U) {
      if (errorExt) {
        var parsedError = Object.assign({}, err, errorExt);
        return [parsedError, undefined];
      }
      return [err, undefined];
    });
}

参考

github.com/scopsy/awai…