js实现promisefy
Promisefy 的实现方法
Promisefy 是指将回调风格的函数转换为返回 Promise 的函数。以下是几种实现方式:
使用 Promise 构造函数
function promisify(fn) {
return function(...args) {
return new Promise((resolve, reject) => {
fn(...args, (err, result) => {
if (err) {
reject(err);
} else {
resolve(result);
}
});
});
};
}
处理多参数回调
对于回调返回多个参数的情况:

function promisify(fn) {
return function(...args) {
return new Promise((resolve, reject) => {
fn(...args, (err, ...results) => {
if (err) {
reject(err);
} else {
resolve(results.length > 1 ? results : results[0]);
}
});
});
};
}
使用 Node.js 内置工具
Node.js 提供了 util.promisify 方法:
const util = require('util');
const fs = require('fs');
const readFile = util.promisify(fs.readFile);
readFile('file.txt', 'utf8').then(data => {
console.log(data);
});
自定义上下文绑定
处理需要特定 this 绑定的函数:

function promisify(fn, context) {
return function(...args) {
return new Promise((resolve, reject) => {
fn.call(context, ...args, (err, result) => {
if (err) {
reject(err);
} else {
resolve(result);
}
});
});
};
}
批量转换对象方法
转换对象的所有方法:
function promisifyAll(obj) {
const result = {};
for (const key in obj) {
if (typeof obj[key] === 'function') {
result[key] = promisify(obj[key].bind(obj));
} else {
result[key] = obj[key];
}
}
return result;
}
处理特殊回调模式
针对某些库的特殊回调模式(如 error-first + success + complete):
function advancedPromisify(fn) {
return function(...args) {
return new Promise((resolve, reject) => {
fn(...args, {
error: reject,
success: resolve
});
});
};
}
这些方法可以根据具体需求进行调整,核心思想是将回调机制封装在 Promise 中,使异步代码可以使用 Promise 链式调用或 async/await 语法。






