promise构造函数用于封装回调式异步操作,接收立即执行的executor函数,其参数resolve和reject分别处理成功与失败状态,需显式调用且仅首次生效。

Promise 构造函数是创建 Promise 实例的底层方式,适合封装回调风格的异步操作(比如原生 XMLHTTPRequest、setTimeout、Node.js 的 fs.readFile 等),让你能把“老式”异步代码转为可链式调用、可统一错误处理的 Promise 风格。
Promise 构造函数的基本写法
构造函数接收一个执行器函数(executor),该函数立即执行,并传入两个参数:resolve 和 reject —— 它们都是函数,由 JavaScript 引擎提供:
-
resolve(value):表示操作成功,将 Promise 状态变为
fulfilled,并把value作为后续.then()的参数 -
reject(reason):表示操作失败,将状态变为
rejected,reason通常是一个 Error 实例,会被后续.catch()或.then(null, ...)捕获
示例:用 Promise 封装 setTimeout 模拟延迟请求
const delayedHello = new Promise((resolve, reject) => {
setTimeout(() => {
// 假设 800ms 后成功
resolve('Hello from Promise!');
}, 800);
});
delayedHello.then(console.log); // 800ms 后输出 'Hello from Promise!'
处理可能出错的异步操作
真实场景中,异步操作常有失败可能(如网络超时、文件不存在)。应在 executor 内主动调用 reject,而不是让错误未被捕获或抛到全局。
- 不要在 executor 中 throw 错误来代替 reject(虽然 Promise 会自动捕获并等价于 reject,但语义不清晰,且无法自定义 reason 结构)
- 推荐显式调用
reject(new Error(...)),便于后续区分错误类型
示例:封装一个带超时和失败模拟的请求
function fakeFetch(url, timeout = 3000) {
return new Promise((resolve, reject) => {
const timer = setTimeout(() => {
reject(new Error(`Request to ${url} timed out after ${timeout}ms`));
}, timeout);
// 模拟随机失败(20% 概率)
const shouldFail = Math.random() {
clearTimeout(timer);
if (shouldFail) {
reject(new Error(`Network error for ${url}`));
} else {
resolve({ data: `Response from ${url}`, status: 200 });
}
}, 1000);
});
}
fakeFetch('/api/user')
.then(res => console.log(res.data))
.catch(err => console.error('Failed:', err.message));
常见误区与注意事项
- executor 是同步执行的:Promise 构造函数一调用,executor 就立刻运行(即使里面全是异步逻辑),所以不能靠它“延迟执行”
- resolve/reject 只生效第一次:多次调用 resolve 或先 resolve 再 reject,后续调用会被忽略
-
避免“Promise 地狱”:不要在 executor 里嵌套多个 new Promise;优先用
.then()链式处理,或用 async/await - 不要忘记 reject:尤其在回调中遗漏错误分支,会导致 Promise 永远 pending,难以调试
何时用 Promise 构造函数?
它不是日常首选(多数情况直接用 fetch()、axios.get() 这类已返回 Promise 的 API),而是在以下场景真正需要:
- 包装尚未返回 Promise 的老接口(如 jQuery.ajax、MongoDB Node 驱动的 callback 模式)
- 实现自定义异步控制流(如 retry、race、allSettled 的简易版)
- 学习 Promise 原理或写工具函数(如 promisify)
不复杂但容易忽略:Promise 构造函数的核心,是把“不确定何时发生、是否成功”的事情,明确交由 resolve/reject 控制其终态。写对 executor 的逻辑,就掌握了 Promise 的起点。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











