1. 源码简介

await-to-js 可谓久仰大名了,但没有用过。官方简介其功能为:Async await wrapper for easy error handing,我大概理解为 async await 的一个错误包装器。相信不少人面试被问到过,怎么捕获async await的错误吧,我第一反应就是catch。让我们来看看await-to-js是怎么做的吧。

2. 查看测试用例,理解其用法

这里不贴代码了,减少一点篇幅:https://github.com/scopsy/await-to-js/blob/master/test/await-to-js.test.ts

官方给出了四个测试用例:

  • should return a value when resolved

正常resolved时err应该为null,data正常返回。

  • should return an error when promise is rejected’

正常rejected时err应该有返回,data应该为undefined

  • should add external properties to the error object

可以给error添加额外的返回值

  • should receive the type of the parent if no type was passed

一开始看不懂,看了源码后发现指的是类型。如果没有给to指定类型,默认返回值类型。

3. 源码

  1. /**
  2. * @param { Promise } promise
  3. * @param { Object= } errorExt - Additional Information you can pass to the err object
  4. * @return { Promise }
  5. */
  6. export function to<T, U = Error> (
  7. promise: Promise<T>,
  8. errorExt?: object
  9. ): Promise<[U, undefined] | [null, T]> {
  10. return promise
  11. .then<[null, T]>((data: T) => [null, data])
  12. .catch<[U, undefined]>((err: U) => {
  13. if (errorExt) {
  14. const parsedError = Object.assign({}, err, errorExt);
  15. return [parsedError, undefined];
  16. }
  17. return [err, undefined];
  18. });
  19. }

它的用法是:
const [err, data] = await to(promise);

原来的用法是:
const data = await promise().catch(err => console.log(err))

我的感受就是将catch后面那段小尾巴,放到前面来了,使得语法更简单,更容易明白。技巧方面值得学习,虽然目前在大部分业务中可能用不到这个库(一般在请求函数catch了),但在写小工具的时候感觉还是非常nice的。

类型也值得学习,这个方法适合新手练习TS语法。

终于写完了,感谢年年又让我水了一篇。