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. 源码
/**
* @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];
});
}
它的用法是:
const [err, data] = await to(promise);
原来的用法是:
const data = await promise().catch(err => console.log(err))
我的感受就是将catch后面那段小尾巴,放到前面来了,使得语法更简单,更容易明白。技巧方面值得学习,虽然目前在大部分业务中可能用不到这个库(一般在请求函数catch了),但在写小工具的时候感觉还是非常nice的。
类型也值得学习,这个方法适合新手练习TS语法。
终于写完了,感谢年年又让我水了一篇。