:Promise)
一、什么是 PromisePromise 是 Node.js 中处理异步操作的核心概念之一。Promise 提供了一种更优雅的方式来管理异步代码避免了传统的回调地狱Callback Hell问题。Promise 的三种状态状态说明Pending等待中初始状态既不是成功也不是失败Fulfilled已成功操作成功完成Rejected已失败操作失败Promise 的状态一旦改变从 pending 变为 fulfilled 或 rejected就不会再改变。二、创建 Promise在 Node.js 中可以使用 Promise 构造函数创建新的 Promise 对象const myPromise new Promise((resolve, reject) { // 异步操作 const success true; // 假设这是异步操作的结果 if (success) { resolve(操作成功); // 状态变为 fulfilled } else { reject(操作失败); // 状态变为 rejected } });三、使用 PromisePromise 提供了.then()和.catch()方法来处理成功和失败的情况myPromise .then((result) { console.log(result); // 输出操作成功 }) .catch((error) { console.error(error); // 输出操作失败 });最终操作 .finally()无论 Promise 成功还是失败都会执行.finally()方法适合用于清理资源等操作myPromise .then(result console.log(result)) .catch(error console.error(error)) .finally(() { console.log(操作完成无论成功或失败); });四、Promise 链式调用Promise 的强大之处在于可以链式调用多个异步操作function asyncOperation1() { return new Promise((resolve) { setTimeout(() resolve(第一步完成), 1000); }); } function asyncOperation2(data) { return new Promise((resolve) { setTimeout(() resolve(${data}, 第二步完成), 1000); }); } asyncOperation1() .then((result) asyncOperation2(result)) .then((finalResult) { console.log(finalResult); // 输出第一步完成, 第二步完成 }) .catch((error) { console.error(链式中出错:, error); });五、Promise 的静态方法Promise.all()等待所有Promise 完成或任意一个 Promise 失败const promise1 Promise.resolve(第一个); const promise2 Promise.resolve(第二个); Promise.all([promise1, promise2]) .then((results) { console.log(results); // 输出[第一个, 第二个] }) .catch((error) { console.error(其中一个失败:, error); });Promise.allSettled()等待所有 Promise 完成无论成功或失败const promise1 Promise.resolve(成功); const promise2 Promise.reject(失败); Promise.allSettled([promise1, promise2]) .then((results) { results.forEach(result { if (result.status fulfilled) { console.log(成功:, result.value); } else { console.log(失败:, result.reason); } }); });Promise.race()返回最先完成的 Promiseconst promise1 new Promise((resolve) setTimeout(resolve, 500, 第一个)); const promise2 new Promise((resolve) setTimeout(resolve, 100, 第二个)); Promise.race([promise1, promise2]) .then((result) { console.log(result); // 输出第二个 });Promise.any()返回第一个成功的 Promise忽略失败const promise1 Promise.reject(失败1); const promise2 Promise.resolve(成功2); Promise.any([promise1, promise2]) .then((result) { console.log(result); // 输出成功2 }) .catch((error) { console.log(所有都失败了:, error); });六、错误处理Promise 的错误处理可以通过.catch()或.then()的第二个参数实现// 方式一使用 .catch() someAsyncFunction() .then((result) { /* 处理成功 */ }) .catch((error) { /* 处理所有错误 */ }); // 方式二使用 .then() 的第二个参数 someAsyncFunction() .then( (result) { /* 处理成功 */ }, (error) { /* 处理失败 */ } );错误处理的注意事项// 错误示例如果中间 .then() 中抛出错误后面的 .catch() 会捕获 someAsyncFunction() .then((result) { throw new Error(中间处理出错); }) .catch((error) { console.error(捕获到:, error); }); // 最佳实践链式调用时在所有 .then() 之后只用一个 .catch() fetchData() .then(processData) .then(saveData) .then(displayResult) .catch(error console.error(流程中出错:, error));七、async/await 语法ES2017 引入了 async/await 语法让 Promise 的使用更加直观使异步代码看起来像同步代码async function runOperations() { try { const result1 await asyncOperation1(); const result2 await asyncOperation2(result1); console.log(result2); } catch (error) { console.error(error); } } runOperations();八、常见模式将回调函数转换为 Promiseconst fs require(fs); // 将回调风格的函数转换为 Promise function readFilePromise(filePath) { return new Promise((resolve, reject) { fs.readFile(filePath, utf8, (err, data) { if (err) { reject(err); } else { resolve(data); } }); }); } // 使用 readFilePromise(example.txt) .then(data console.log(data)) .catch(err console.error(err));使用 util.promisifyNode.js 内置了util.promisify工具可以方便地将回调风格的函数转换为返回 Promise 的函数const fs require(fs); const util require(util); const readFilePromise util.promisify(fs.readFile); const writeFilePromise util.promisify(fs.writeFile); // 使用 readFilePromise(example.txt, utf8) .then(data { console.log(data); return writeFilePromise(output.txt, data); }) .then(() console.log(写入完成)) .catch(err console.error(err));九、静态方法对比方法说明触发失败条件Promise.all()等待所有完成任意一个失败Promise.allSettled()等待所有完成永不失败Promise.race()返回最先完成的最先完成的失败则失败Promise.any()返回第一个成功的全部失败十、最佳实践实践说明总是处理错误不要忽略.catch()或 try-catch避免嵌套使用链式调用或 async/await 保持代码扁平命名 Promise给 Promise 变量起有意义的名称返回 Promise在函数中返回 Promise 以便链式调用使用 finally用于清理资源无论成功或失败都执行十一、本章小结知识点说明Promise 状态Pending、Fulfilled、Rejected状态一旦改变不可逆创建 Promisenew Promise((resolve, reject) {})使用 Promise.then()处理成功.catch()处理失败链式调用多个异步操作顺序执行保持代码扁平静态方法Promise.all()、Promise.race()、Promise.any()、Promise.allSettled()async/awaitES2017 语法糖让异步代码像同步代码工具方法util.promisify()将回调函数转为 Promise提示Promise 是现代 Node.js 异步编程的基础。理解 Promise 是掌握 async/await 的前提。建议优先使用 async/await 方式编写异步代码它让异步逻辑更清晰、更易于维护。