promise构造器内不可throw,须用reject();.then()需显式return避免undefined;.catch()不捕获构造器同步异常、外部错误及未终止链;all/race/allsettled语义不同,需按业务选型。

Promise 基础误区:别在构造器里直接 throw
很多人写 Promise 时习惯这样:
❌ 错误写法:const p = new Promise((resolve, reject) => {
if (someCondition) throw new Error('boom'); // ❌ 同步异常不会被 catch 捕获到 Promise 链中
resolve('ok');
});
这会导致未捕获的同步异常,而不是进入 .catch()。正确做法是显式调用 reject():
const p = new Promise((resolve, reject) => {
if (someCondition) return reject(new Error('boom')); // ✅ 显式 reject
resolve('ok');
});
链式调用陷阱:忘记 return 导致值丢失或隐式包装
在 .then() 中不返回值,后续的 .then() 会收到 undefined;若返回普通值(非 Promise),会被自动包装成 Promise.resolve(value);但若忘了 return,就容易误以为流程继续了:
promise.then(res => {
process(res);
// ❌ 忘记 return,下一个 then 收到 undefined
}).then(next => console.log(next)); // → undefined
常见修复方式:
DMap GL地图JSAPI(dmapgl)开发指南。用于编写、审查、调试 DMap 地图 API 代码,涵盖地图初始化、覆盖物渲染、图层管理、事件处理、控件交互等任务。当用户提及 dmap、dmapgl、jsapi‑gl 或相关地图开发需求时自动触发。
- 异步操作必须 显式 return Promise(如
return fetch(...)) - 同步转换需 return 新值(如
return res.data) - 不确定是否 Promise?用
return Promise.resolve(x).then(...)或直接return x(现代 JS 自动包装)
错误处理盲区:.catch() 不会捕获所有异常
.catch() 只捕获前一个 Promise 的 rejection 和 .then() 回调中抛出的异常,但有三类常被忽略:
-
构造器内同步 throw(如上所述,需改用
reject()) -
回调函数外的异常(如
.then()外部代码报错,和 Promise 无关) -
未终止的 Promise 链(末尾没加
.catch(),错误静默丢失)
推荐写法:每个 Promise 链末尾都加上 .catch(console.error),或统一用 async/await + try/catch 替代。
并发控制雷区:all、race、allSettled 混用导致逻辑错乱
三个方法行为差异大,选错会引发意料外结果:
-
Promise.all([...]):任一失败则整体失败,适合“全成功才继续”场景 -
Promise.race([...]):首个 settle(无论 fulfiled/rejected)即结束,适合超时控制 -
Promise.allSettled([...]):全部完成才结束,结果含 status 字段,适合“不管成败都要汇总”
典型错误:用 all 请求多个接口,其中一个 404 就让整个流程中断;应根据业务目标选择——要容错就用 allSettled,要强一致性才用 all。










