本文参加了由公众号@若川视野 发起的每周源码共读活动,点击了解详情一起参与。
概念
-
Async await wrapper for easy error handling 轻松处理错误的异步等待封装器
-
使用
await处理异步操作时, Promise 有可能返回rejected,一般会将await放到try...catch中,await-to-js可以解决不使用try...catch处理rejected
使用 和 对比
import to from 'await-to-js'
async fn() {
const [err, res] = await to(asyncFn())
if (err) {
// ...
}
// ...
}
// 多个异步操作情况
// async await
function async fn() {
try {
const p1 = await sFn1()
} catch {
// ...
}
try {
const p2 = await sFn2()
} catch {
// ...
}
try {
const p3 = await sFn3()
} catch {
// ...
}
}
// await to js
function async fn() {
const [e1, r1] = await to(sFn1())
if (e1) { // ...}
const [e2, r2] = await to(sFn2())
if (e2) { // ...}
const [e3, r3] = await to(sFn3())
if (e3) { // ...}
}
实现
- 参数
- promise 异步操作
- errorExt 自定义扩展错误信息
Object.assign({}, err, errorExt)
- 返回值:
then返回[null, data],catch返回[err, undefined]
/**
* @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;
收获
- 简单至上