js实现promisify
实现 promisify 的方法
promisify 是将基于回调的函数转换为返回 Promise 的函数。以下是几种实现方式:
基本实现
适用于 Node.js 风格的回调函数(错误优先的回调):
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 上下文不被丢失:
function promisify(fn) {
return function(...args) {
return new Promise((resolve, reject) => {
fn.call(this, ...args, (err, result) => {
if (err) {
reject(err);
} else {
resolve(result);
}
});
});
};
}
使用 Node.js 内置工具
Node.js 的 util 模块已提供 promisify:
const { promisify } = require('util');
const fs = require('fs');
const readFileAsync = promisify(fs.readFile);
readFileAsync('file.txt', 'utf8').then(console.log);
注意事项
- 确保回调函数是错误优先风格(即
(err, value) => {})。 - 如果函数需要绑定特定上下文(如对象方法),需显式处理
this。 - 对于非标准回调(如多个成功参数),需自定义解析逻辑。







