最省事的是用 node.js 内置的 util.promisify(),它专为转换 node-style 回调函数设计,零依赖、稳定、自动处理错误;批量转换可用 pify 或 mz 等库;非标准回调需手动封装 promise;小程序和浏览器环境需定制适配。

直接用 Node.js 内置的 util.promisify() 最省事,它专为这种转换设计,零依赖、稳定、符合官方规范。
用内置工具:util.promisify()
Node.js 从 v8.0 开始原生支持该方法,适用于所有遵循 (err, result) 约定的回调函数(即“Node-style callback”)。
- 只需传入目标函数,它就返回一个等效的 Promise 版本
- 无需安装额外包,不引入运行时开销
- 自动处理错误:回调中传入
err,Promise 就 reject;传入result,Promise 就 resolve
示例:
const fs = require('fs');const util = require('util');
const readFile = util.promisify(fs.readFile);
const stat = util.promisify(fs.stat);
async function run() {
try {
const data = await readFile('config.json', 'utf8');
const info = await stat('config.json');
console.log(data, info.size);
} catch (err) {
console.error(err);
}
}
批量转换整个模块
当需要把一个模块(如 fs、dns)里几十个方法都 Promise 化时,手动调用 promisify 太繁琐。这时可用第三方库简化流程。
-
pify:轻量、可配置(比如
multiArgs: true支持多返回值) -
mz:专为 Node.js 核心模块优化,已预置
fs、child_process等模块的 Promise 版本,开箱即用 - es6-promisify:API 简洁,适合老项目快速接入
例如用 pify 批量处理:
const pify = require('pify');
const fsP = pify(fs); // 所有 fs 方法都变成 Promise 返回
const data = await fsP.readFile('package.json');
手动封装:适用于非标准回调格式
如果回调函数不按 (err, result) 形式传递参数(比如只有 result、或多个结果、或用事件触发),就不能直接用 util.promisify()。此时需手写 Promise 包装器。
- 用
new Promise((resolve, reject) => {...})显式控制状态 - 注意正确捕获同步异常(如参数校验失败)并
reject - 确保回调只执行一次,避免重复
resolve或reject
示例(适配仅传 result 的回调):
function wrapSimpleCallback(fn, ...args) {return new Promise((resolve) => {
fn(...args, (result) => resolve(result));
});
}
// 使用
const result = await wrapSimpleCallback(someLib.getData, 'id123');
小程序与浏览器环境的特别处理
微信小程序、支付宝小程序等平台 API 多数是 success/fail/complete 三回调结构,不属于 Node-style,不能直传给 util.promisify()。
- 推荐使用社区封装好的适配包,如
@miniprogram-api-promise - 也可自行封装通用 wrapper,统一转为 Promise,并兼容
fail错误和complete统一收口 - 浏览器 DOM 事件(如
load、click)可用once+Promise组合实现
例如封装小程序 API:
function promisifyWx(api, options) {return new Promise((resolve, reject) => {
api({
...options,
success: resolve,
fail: reject
});
});
}
// 调用
const res = await promisifyWx(wx.request, { url: '/api/user' });
大量免费API接口:立即使用
涵盖生活服务API、金融科技API、企业工商API、等相关的API接口服务。免费API接口可安全、合规地连接上下游,为数据API应用能力赋能!











