js实现promisify
实现 promisify 的方法
promisify 是一种将基于回调的函数转换为返回 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]);
}
});
});
};
}
支持 this 绑定
如果被转换的函数依赖于 this 上下文,可以通过传递 thisArg 来绑定:
function promisify(fn, thisArg) {
return function(...args) {
return new Promise((resolve, reject) => {
fn.call(thisArg, ...args, (err, result) => {
if (err) {
reject(err);
} else {
resolve(result);
}
});
});
};
}
使用 Node.js 内置 util.promisify
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));
自定义 promisify 方法
如果需要更复杂的逻辑,可以扩展 promisify 方法:
function promisify(fn, options = {}) {
return function(...args) {
return new Promise((resolve, reject) => {
const callback = (err, ...results) => {
if (err) {
reject(err);
} else if (options.multiArgs) {
resolve(results);
} else {
resolve(results[0]);
}
};
fn.call(this, ...args, callback);
});
};
}
使用示例
将 fs.readFile 转换为 Promise:
const fs = require('fs');
const readFilePromise = promisify(fs.readFile);
readFilePromise('file.txt', 'utf8')
.then(data => console.log(data))
.catch(err => console.error(err));
注意事项
- 确保回调函数的最后一个参数是回调函数。
- 如果回调函数可能返回多个值,需要处理多个返回值的情况。
- 如果函数依赖于
this上下文,需要正确绑定this。






