js实现promisefy
Promisefy 的实现方法
将回调风格的函数转换为返回 Promise 的函数,可以通过以下方式实现:
function promisify(fn) {
return function(...args) {
return new Promise((resolve, reject) => {
fn(...args, (err, result) => {
if (err) {
reject(err);
} else {
resolve(result);
}
});
});
};
}
使用示例
假设有一个回调风格的函数 readFile:
const fs = require('fs');
const readFilePromise = promisify(fs.readFile);
readFilePromise('file.txt', 'utf8')
.then(data => console.log(data))
.catch(err => console.error(err));
支持多个返回值的情况
如果回调函数可能返回多个值,可以修改为:
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 内置的 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))
.catch(err => console.error(err));
处理 this 绑定
如果函数需要绑定特定的 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);
}
});
});
};
}
处理非标准回调函数
对于回调参数位置不标准的函数,可以自定义 promisify:

function customPromisify(fn) {
return function(...args) {
return new Promise((resolve, reject) => {
const customCallback = (result, err) => {
if (err) {
reject(err);
} else {
resolve(result);
}
};
fn(...args, customCallback);
});
};
}






