2026-04-03 06:37:20
Promise 是 JavaScript 中用于优雅处理异步操作的核心机制,通过封装异步任务的状态和结果,避免了传统回调嵌套的复杂性,使代码更易读和维护。 以下是关于 Promise 的详细解析:
核心概念与运行原理Pending(进行中):初始状态,操作未完成。
Fulfilled(已成功):操作成功完成,调用 resolve 触发。
Rejected(已失败):操作失败,调用 reject 触发。
状态不可逆:一旦从 Pending 转为 Fulfilled 或 Rejected,状态不再变化。
then(onFulfilled):注册成功回调,接收 resolve 传递的值。
catch(onRejected):注册失败回调,接收 reject 传递的错误。
finally():无论成功或失败均执行,常用于资源清理。
promise .then(result => console.log(result)) .catch(error => console.error(error)) .finally(() => console.log('操作结束'));结合 fetch API 处理异步数据获取:
fetch('使用 fs.promises 读取文件:
const fs = require('fs').promises;async function readFile(filename) { try { const data = await fs.readFile(filename, 'utf8'); console.log(data); } catch (error) { console.error('文件读取失败:', error); }}通过 setTimeout 实现延迟:
function delay(ms) { return new Promise(resolve => setTimeout(resolve, ms));}delay(2000).then(() => console.log('2秒后执行'));使用 Promise.all 等待多个任务完成:
Promise.all([task1(), task2(), task3()]) .then(results => console.log('所有任务完成:', results)) .catch(error => console.error('任务失败:', error));优先使用链式调用而非嵌套 then:
// 不推荐promise1().then(result1 => { promise2(result1).then(result2 => { /* ... */ });});// 推荐promise1() .then(result1 => promise2(result1)) .then(result2 => /* ... */);每个链式调用后务必添加 catch,或使用 try/catch 包裹 async/await。
在 then 或 async 函数中显式返回结果,以便后续链式调用:
async function fetchData() { return fetch('/api/data') .then(response => response.json()) .then(data => processData(data)); // 返回处理后的数据}根据场景选择 Promise.all(全部完成)、Promise.race(首个完成)或 Promise.allSettled(全部完成,无论成功失败)。
使用语法糖简化异步代码:
async function main() { try { const data = await fetchData(); console.log(data); } catch (error) { console.error(error); }}Promise 通过状态管理和链式调用,彻底改变了 JavaScript 异步编程的范式。结合 async/await 语法糖后,代码更接近同步逻辑,显著提升了可读性和可维护性。掌握 Promise 是成为高效前端开发者的关键一步。