如何编写可执行任意类型function(含async)的通用执行函数?
通用执行函数实现方案
完全可以实现,该函数的核心逻辑是统一同步、异步函数的返回格式,同时分阶段捕获所有运行时错误。
实现代码(JavaScript示例)
function runAnyFunction(fn, ...args) { try { // 同步执行阶段捕获同步抛出的错误 const result = fn(...args); // 对返回值做Promise包装,兼容同步/异步返回场景 return Promise.resolve(result); } catch (syncErr) { // 同步错误统一封装为rejected Promise返回,对齐异步错误处理逻辑 return Promise.reject(syncErr); } }
核心特性
- 无论传入的是同步函数还是异步函数,返回值永远是Promise类型,可统一通过
await或者.then()获取返回结果 - 全场景错误捕获:覆盖同步执行阶段抛出的错误、async函数内部抛出的错误、普通函数返回rejected Promise的错误,所有错误都可以通过
.catch()或者try...catch(await runAnyFunction())捕获 - 入参透传:调用时传入的额外参数会完整传递给目标函数
测试用例
可以覆盖所有常见使用场景:
// 1. 普通同步函数正常返回 const syncNormal = (a, b) => a + b; runAnyFunction(syncNormal, 1, 2).then(res => console.log(res)); // 输出3 // 2. 同步函数抛出错误 const syncThrow = () => { throw new Error('同步执行错误') }; runAnyFunction(syncThrow).catch(err => console.log(err.message)); // 输出 同步执行错误 // 3. 异步函数正常返回 const asyncNormal = async (a, b) => { await new Promise(r => setTimeout(r, 100)); return a * b; } runAnyFunction(asyncNormal, 3, 4).then(res => console.log(res)); // 输出12 // 4. 异步函数抛出错误 const asyncThrow = async () => { await new Promise(r => setTimeout(r, 100)); throw new Error('异步执行错误'); } runAnyFunction(asyncThrow).catch(err => console.log(err.message)); // 输出 异步执行错误 // 5. 普通函数返回rejected Promise const returnReject = () => Promise.reject(new Error('返回Promise reject错误')); runAnyFunction(returnReject).catch(err => console.log(err.message)); // 输出 返回Promise reject错误
注意事项
如果需要在非async上下文调用,直接通过.then().catch()链式调用处理即可,不需要额外做异步语法适配,所有返回和错误处理逻辑完全统一。
内容的提问来源于stack exchange,提问作者cacuto hana
相关产品推荐
相关产品推荐

