Promise构造函数必须传入执行器函数,否则报错;then链中错误捕获遵循就近原则,推荐用.then().catch();async/await需用try/catch包裹await;并行选Promise.all(全成功)、allSettled(全返回)、race(首个settled)。

Promise 构造函数怎么写才不会报 undefined 或 executor is not a function
Promise 必须传入一个执行器函数(executor),它接收 resolve 和 reject 两个参数。常见错误是漏写函数、传了 null 或直接传值:
- ❌ 错误写法:
new Promise(null)、new Promise(123)、new Promise()(无参) - ✅ 正确写法:
new Promise((resolve, reject) => { /* 异步逻辑 */ }) - ⚠️ 注意:executor 会立即同步执行,所以里面不能只放同步代码还期望“等一会再 resolve”——那只是普通函数调用,不是异步控制
then 和 catch 链式调用中,错误到底被谁捕获?
Promise 链的错误传递遵循就近原则,但容易误判位置。关键点在于:then 的第二个参数只捕获前一个 Promise 的 rejection,而 catch 会捕获链上前面所有未处理的 rejection。
- ❌
promise.then(success, fail)中的fail不会捕获success内抛出的错误 - ✅ 推荐写法:
promise.then(success).catch(fail)—— 这样success函数里throw或返回被 reject 的 Promise 都会被catch捕获 - ⚠️ 注意:
catch后如果没再抛错,后续then仍会执行(因为catch默认返回 fulfilled 状态)
用 async/await 替代 then 链时,try/catch 怎么配对才不漏错?
async/await 让异步像同步一样写,但错误处理必须显式用 try/catch,否则未捕获的 rejection 会变成 unhandled rejection。
- ✅ 必须把 await 表达式包在
try块里:try { const data = await fetch(...); } catch (err) { ... } - ⚠️
catch只捕获当前await的 rejection,多个 await 要共用一个try/catch才能统一处理,或各自独立处理 - ⚠️ 不要这样写:
const data = await fetch(...).catch(...)—— 这会让data变成undefined或错误对象,破坏类型预期
多个异步操作并行还是串行?Promise.all、Promise.allSettled、Promise.race 怎么选?
选错方法会导致逻辑异常或掩盖问题。核心区别不在“快慢”,而在“失败策略”和“返回结构”:
立即学习“Java免费学习笔记(深入)”;
-
Promise.all:全部成功才 resolve,任一 reject 整体 reject —— 适合强依赖场景(如同时上传多个文件,缺一不可) -
Promise.allSettled:不管成败都等全部结束,返回每个结果的状态对象 —— 适合批量请求且需分别处理(如发 5 个 API,统计成功几个) -
Promise.race:谁先 settle(fulfill 或 reject)就用谁的结果 —— 常用于超时控制:Promise.race([fetch(), timeout(5000)]) - ⚠️ 注意:
Promise.all中某个 Promise 抛错后,其他仍在运行(不会自动取消),如需中断,得靠 AbortController 等机制配合
真正难的不是写对语法,而是判断哪个环节该 reject、哪个该 catch、哪个该吞掉、哪个该重试——这些没法靠 Promise 自动推断,得结合业务语义来设计。











