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];
});
}