用 Promise 改造 Node.js 的 Error-first 回调函数,核心是将回调封装为返回 Promise 的函数,统一通过 resolve/reject 处理成功与错误;推荐使用 util.promisify(Node.js 8+)自动转换,或手动用 Promise 构造器包装;支持链式调用、Promise.all 并发及 try/catch 清晰捕获错误。

用 Promise 改造 Node.js 的 Error-first 回调函数,核心是把回调函数包装成返回 Promise 的函数,让错误和成功路径统一走 reject / resolve,从而支持 then、catch 和 async/await。
用 util.promisify 快速转换(推荐)
Node.js 8+ 内置的 util.promisify 可直接将符合 Error-first 规范的函数(如 fs.readFile、dns.lookup)转为 Promise 版本:
- 要求原函数最后一个参数是回调函数,且该回调第一个参数为
Error,第二个为结果值 - 自动处理错误:只要回调里传了非 null 的
Error,Promise 就会reject - 示例:
const fs = require('fs').promises;(Node.js 10+ 直接提供 Promise 封装)或const { promisify } = require('util'); const readFile = promisify(fs.readFile);
手动封装:用 Promise 构造函数包装
对不支持 promisify 的自定义回调函数,或需额外控制逻辑时,手动包装:
详细的 Three.js 3D 图形参考,涵盖场景设置、相机、几何体、材质、光照、动画、控制器、加载器、数学工具和调试。
- 创建新函数,返回
new Promise(...) - 在 Promise 执行器中调用原回调函数,把
resolve和reject传给它作为回调 - 注意:必须只调用一次
resolve或reject,避免多次触发 - 示例:
function promisifiedReadFile(path) { return new Promise((resolve, reject) => { fs.readFile(path, (err, data) => { if (err) reject(err); else resolve(data); }); }); }
处理多个异步操作:链式与并发
改造后可自然组合异步流程:
立即学习“Java免费学习笔记(深入)”;
-
串行:用
.then()或await顺序执行,上一步结果直接传给下一步 -
并行:用
Promise.all([p1, p2, p3])同时发起多个 Promise,任一失败则整体失败 -
容错并行:用
Promise.allSettled([...])获取每个 Promise 的最终状态(fulfilled/rejected)
错误处理更清晰
相比嵌套回调,Promise 错误能集中捕获:
-
.catch()可捕获链中任意环节抛出的异常或被reject的 Promise -
async/await中用try/catch捕获,语义更接近同步代码 - 注意:未被
catch的 rejection 会触发unhandledrejection事件,应监听避免静默失败

















