Promise 解决回调地狱问题,通过链式调用提升可读性、统一错误处理、支持并行与中断;但无法取消、无进度反馈、错误易静默,需配合 AbortController 等方案。
JavaScript 使用 Promise 不是为了“更酷”,而是因为回调函数嵌套(即“回调地狱”)在处理多个异步操作时会迅速失控——可读性崩坏、错误难捕获、流程难复用。
比如连续发起三个 API 请求,后一个依赖前一个返回的 ID:
getUser(id, function(user) {
getPosts(user.id, function(posts) {
getComments(posts[0].id, function(comments) {
console.log(comments);
});
});
});
这种写法的问题很实际:
error 处理必须每层单独写,漏一层就静默失败return 中断流程,也无法用 try/catch 统一兜底Promise 把异步操作包装成“可链式操作的对象”,核心是把“怎么继续”从嵌套结构里抽出来,变成线性表达:
getUser(id)
.then(user => getPosts(user.id))
.then(posts => getComments(posts[0].id))
.then(comments => console.log(comments))
.catch(err => console.error('出错了:', err));
关键点:
then 返回一个新的 Promise,天然支持链式调用catch 在链末尾就能捕获前面任意环节抛出的异常(包括 throw 和 rejected promise)Promise.all([p1, p2]),不用手写计数器或状态标记throw 或返回一个永远不 resolve 的 Promise
Promise 解决了回调嵌套,但没解决所有异步痛点:
AbortController 是后来补的方案)catch,rejected promise 不会抛到全局,控制台可能只给个警告Promise.resolve().the
n(() => console.log(2)); console.log(1) 输出是 1 然后 2,不是直觉上的“先定义再执行”真正麻烦的从来不是语法,而是把“等待结果”的心智模型从“等回调进来”切换成“我拿到一个承诺对象,它将来会兑现或拒绝”。这个转变不到位,async/await 也照样写成回调套壳。