Promise构造函数不支持自动等待异步,executor同步立即执行,需手动调用resolve/reject改变状态;异步任务须在executor内启动并显式回调,不可依赖await,链式处理才是核心。

ES6 中的 Promise 构造函数(即 new Promise(executor))本身**不支持直接“等待”异步操作完成后再进入后续流程**,它的 executor 函数是**同步立即执行**的。所以关键不是“在 constructor 内部处理异步”,而是**在 executor 函数体内启动异步任务,并在任务完成时主动调用 resolve 或 reject** 来改变 Promise 状态。
executor 必须手动触发 resolve/reject
Promise 构造器不会自动识别你写了 setTimeout、fetch 或 axios.get 就帮你“等结果”。它只做一件事:立刻运行你传入的函数(executor),并把 resolve 和 reject 两个函数作为参数交给你。剩下的——什么时候调、调谁、传什么——全由你控制。
- 如果你忘了调
resolve或reject,Promise 就永远卡在pending状态 - 如果异步操作出错但你没捕获(比如没写
catch),错误不会自动变成reject,可能静默失败或抛到全局 - executor 内部可以混合同步和异步代码,但只有调用
resolve/reject才真正“兑现” Promise
常见异步启动方式 + 正确回调模式
实际写法取决于你封装的是哪种异步源:
-
原生
setTimeout/setInterval:
直接在回调里调resolve,例如:setTimeout(() => resolve('done'), 1000) -
XMLHttpRequest 或
fetch:
在.then()和.catch()里分别调resolve(data)和reject(err);fetch还需注意response.ok判断 HTTP 状态 -
第三方库如 Axios:
推荐用axios.get(...).then(resolve).catch(reject),避免多层嵌套 -
Node.js 的回调风格 API(如 fs.readFile):
用fs.readFile(path, (err, data) => { if (err) reject(err); else resolve(data); })
不能在 constructor 里 await,但可以用 async 包一层
new Promise(async (resolve, reject) => {...}) 是语法合法的,但 async 不会改变 executor 立即执行的本质,且容易引发误解:你不能直接 await 后 return,因为 executor 不接受返回值。正确做法是把 async 函数写在外面,再把它返回的 Promise 传给 resolve:
- ❌ 错误:
new Promise(async (resolve) => { const data = await fetch('/api'); resolve(data); })—— 虽然能跑,但违背了 Promise 构造初衷,且无法正确处理await抛出的异常(会丢失) - ✅ 推荐:
const p = fetch('/api').then(r => r.json()); new Promise((resolve, reject) => p.then(resolve).catch(reject)),或更简洁地直接用fetch('/api').then(r => r.json())—— 它本来就是 Promise
链式处理才是重点,constructor 只负责“启程”
构造 Promise 只是起点。真正组织异步逻辑靠的是 .then()、.catch()、.finally() 和组合方法(如 Promise.all)。例如:
- 串行请求:
getUser().then(user => getPosts(user.id)).then(posts => render(posts)) - 并行加载:
Promise.all([loadHeader(), loadSidebar(), loadMain()]) - 兜底降级:
tryFast().catch(() => trySlow()).then(showResult)


















