如何简化TypeScript/JavaScript中判空返回后解构数组的重复代码?
如何简化TypeScript/JavaScript中判空返回后解构数组的重复代码?
这种重复的「调用异步函数→判空返回→解构数组」确实挺磨人的,我之前处理类似场景时,试过几个实用的方案,分享给你:
方案一:封装辅助函数+try/catch统一处理
这是我最常用的方式,把判空逻辑抽成一个通用辅助函数,遇到空结果就抛出自定义错误,然后在主函数里用try/catch统一捕获并退出,主流程会清爽很多:
首先定义一个自定义错误和辅助函数:
// 自定义错误,用来标记空结果的情况 class EmptyResultError extends Error {} // 辅助函数:调用目标异步函数,结果为空则抛出错误,否则返回结果 async function getOrThrow(fn, ...args) { const result = await fn(...args); if (result == null) { throw new EmptyResultError(); } return result; }
然后改造你的主函数:
async function myLongFunction() { try { // 直接解构,不用再写判空逻辑 const [actual, data, here] = await getOrThrow(whatever); // 带参数的调用也一样 const [other, thing] = await getOrThrow( whatever, actual.something, data.something.else + here.length ); const [final, finalData] = await getOrThrow( whatever, other.count, thing.size ); return `${final.name} ${finalData.size}`; } catch (e) { // 只捕获我们自定义的空结果错误,直接退出函数 if (e instanceof EmptyResultError) { return; } // 其他错误正常抛出,不吞掉异常 throw e; } }
如果是TypeScript,还可以给辅助函数加上类型注解,让类型推断更准确:
class EmptyResultError extends Error {} async function getOrThrow<T extends any[]>( fn: (...args: any[]) => Promise<T | null | undefined>, ...args: any[] ): Promise<T> { const result = await fn(...args); if (result == null) { throw new EmptyResultError(); } return result; }
方案二:辅助函数返回标记值,简化判空
如果你不想用try/catch,也可以让辅助函数在结果为空时返回一个特殊标记,然后用简短的判断退出:
async function getOrNull(fn, ...args) { const result = await fn(...args); return result == null ? null : result; } async function myLongFunction() { const result = await getOrNull(whatever); if (!result) return; const [actual, data, here] = result; const someOtherResult = await getOrNull( whatever, actual.something, data.something.else + here.length ); if (!someOtherResult) return; const [other, thing] = someOtherResult; // 后续逻辑同理... }
这个方案比原始写法少了一半的重复代码(不用每次写if (result == null) { return; },改成if (!result) return;),虽然还是有判断,但简洁了不少。
不推荐的方案:IIFE强制退出
你提到的用IIFE尝试跳出外层函数的写法,确实没法实现——因为IIFE是独立的函数作用域,它的return只能退出自身,影响不了外层的函数。而且这种写法可读性极差,不建议在业务代码里用。
备注:内容来源于stack exchange,提问作者zaitsman
相关产品推荐
相关产品推荐

