将回调函数改造成 Promise 版本需用 Promise 构造函数包装,按回调格式映射 resolve/reject;支持手动封装、util.promisify 等工具;注意避免重复调用、正确处理错误、保持 this 上下文及取消能力。

将不支持 Promise 的回调函数改造成 Promise 版本,核心是用 Promise 构造函数包装原有逻辑,把回调的 success 和 error 分别映射到 resolve 和 reject。
基础封装:手动包装回调函数
适用于任意带“错误优先”回调(即 callback(err, result))的函数,比如 Node.js 原生 API 或老式库方法:
function promisify(fn) {
return function(...args) {
return new Promise((resolve, reject) => {
fn(...args, (err, result) => {
if (err) reject(err);
else resolve(result);
});
});
};
}
// 使用示例:包装 fs.readFile
const fs = require('fs');
const readFile = promisify(fs.readFile);
readFile('./data.txt', 'utf8')
.then(data => console.log(data))
.catch(err => console.error(err));
处理非标准回调格式
有些函数回调不是 (err, data) 形式,比如只有单个参数、或成功/失败用不同回调名(如 success() / fail()),需按实际签名适配:
当用户要求为 Java 代码添加注释、修改注释、审查注释、整理注释格式,或要求按照代码注释规范处理 Java 文件时,使用本技能。本技能用于统一生成和维护 Java 类注释模板、按 Git 对比 release 判断版本号、补充每行代码上方中文块注释、调整注释空行规则,并保持 Java 文件 UTF-8 无 BOM 编码。典型触发场景包括:补充类注释、更新 @version、检查 @author 来源、整理行尾注释、把注释放到代码上一行、检查注释是否符合规范、构建前检查 Java 注释风格。
- 只有成功回调(无 error 参数):默认视为不会失败,或自行判断返回值是否为 null/undefined
- 双回调(
success(val),error(err)):传入对象后分别绑定 - 事件式回调(如
on('done', ...)):用once+ Promise 封装
// 双回调示例:某 SDK 的 upload 方法
function uploadFile(file) {
return new Promise((resolve, reject) => {
sdk.upload(file, {
success: resolve,
error: reject
});
});
}
利用现成工具简化操作
不必每次都手写 new Promise:
立即学习“Java免费学习笔记(深入)”;
- Node.js 10+ 内置
util.promisify(),专为“错误优先”回调设计,支持自定义promiseCallback - Lodash 提供
_.promisify(),兼容更多签名,并可配置multiArgs处理多返回值 - 对于浏览器环境或复杂场景,可用
thenify或pify(轻量、支持自定义 error-first 判断)
注意事项与避坑点
改造时容易忽略的关键细节:
-
不要重复调用 resolve/reject:确保回调只触发一次,必要时加标志位或使用
once类机制 - 错误必须 reject,不能 throw:Promise 内部 throw 会被捕获为 rejection,但外部 throw 不会自动转为 reject
-
保持 this 上下文:若原函数依赖
this(如对象方法),封装时需用fn.bind(this)或箭头函数保留作用域 -
取消能力需额外实现:原生 Promise 不支持取消,如需 abort,得配合
AbortController或返回含 cancel 方法的对象

















