如何将含高阶函数getAddresses的curried函数getId Promise化?
回调转Promise/Async-Await实现方案
核心思路
先把底层的回调式API(getData、queryRecord)封装为Promise版本,再重构依赖它们的函数,用async/await替代嵌套回调,摆脱回调地狱。
步骤1:封装回调转Promise工具函数
如果是Node.js环境,可直接用util.promisify;通用场景下可以自己实现极简版:
// 通用回调转Promise工具,适配(err, result)格式的回调 const promisify = (fn) => (...args) => new Promise((resolve, reject) => { fn(...args, (err, result) => { err ? reject(err) : resolve(result); }); });
步骤2:转第三方库方法为Promise版
const { queryRecord, getData } = require("@xyzLib"); // 转成支持async/await的版本 const getDataAsync = promisify(getData); const queryRecordAsync = promisify(queryRecord);
步骤3:重构getAddresses函数
原来的高阶函数改为返回Promise的async函数,用throw传递错误,return传递成功结果:
const getAddresses = async (result) => { if (!result.success) { throw new Error('Exception details'); } else { const queryResult = await queryRecordAsync(objectName); return queryResult.name; } };
步骤4:重构getId函数
让它返回Promise,不再接收回调,内部用await处理异步流程:
const getId = async () => { // 等待getData返回结果 const dataResult = await getDataAsync("attr1", "attr2"); // 把结果传给getAddresses并等待最终结果 return getAddresses(dataResult); };
步骤5:调用方式(用async/await)
用try/catch捕获所有错误,替代原来的回调错误处理:
// 异步入口函数 const main = async () => { try { const id = await getId(); // 后续的fetch操作 await fetch(encodeURI(settingsUrl), { method: 'GET' }); // ...其他业务逻辑 } catch (error) { console.log(error.message); } }; // 执行入口 main();
关键说明
- 所有回调嵌套都被线性的
await替代,代码可读性大幅提升 - 错误统一通过
try/catch捕获,不再需要在每个回调里处理错误 - 高阶函数的逻辑被拆解为更直观的异步流程,避免了函数嵌套带来的困惑
内容的提问来源于stack exchange,提问作者Hasteq
相关产品推荐
相关产品推荐

