import isPromiseLike from './isPromiseLike';
/**
* 函数守卫。
*
* @alias module:Util.guard
* @since 1.14.0
* @param {Function} fn 要执行的函数。
* @param {Function} [shouldGuard] 函数守卫断言。如果返回 `Truthy` 表示需要守卫,否则不需要守卫。
* @returns 如果函数执行成功,正常返回结果;如果异步函数拒绝或抛出错误时,有函数守卫返回 `undefined`,否则抛出错误。
* @example
* guard(() => 42); // 42
* await guard(() => Primise.resolve(42)); // 42
*
* guard(() => { throw new Error() }); // undefined
* await guard(() => Promise.reject()); // undefined
*/
const guard = (fn, shouldGuard) => {
const _guard = (err) => {
if (shouldGuard && !shouldGuard(err)) {
throw err;
}
return undefined;
};
try {
const result = fn();
return isPromiseLike(result) ? result.catch(_guard) : result;
}
catch (err) {
return _guard(err);
}
};
export default guard;