JavaScript异步编程核心是不阻塞主线程,回调函数易致“回调地狱”且错误难捕获,Promise通过状态管理、链式调用和统一错误处理提升可读性与组合能力。
JavaScript 的异步编程核心在于“不阻塞主线程”,回调函数和 Promise 都是实现方式,但设计思想、错误处理、可读性和组合能力差别明显。
回调函数是把一个函数作为参数传给另一个函数,在异步操作完成后被调用。比如 setTimeout 或老式 AJAX:
getUserById(123, function(user) {
console.log(user.name);
getPostsByUserId(user.id, function(posts) {
console.log(posts.length);
});
});
问题在于嵌套加深时容易形成“回调地狱”——逻辑难追踪、错误难捕获、流程难复用。每个回调都要手动检查 error 参数,且无法用 try/catch 捕获异步错误。
Promise 是一个对象,代表异步操作的最终完成(或失败)及其结果。它有三种状态:pending(进行中)、fulfilled(成功)、rejected(失败),且状态不可逆。
立即学习“Java免费学习笔记(深入)”;
.then() 处理成功,.catch() 统一捕获链上任意环节的错误fetch(...).then(res => res.json()).then(data => ...)
try/catch(配合 async/await)Promise.all()、Promise.race() 等组合控制并发行为.catch() 可集中拦截AbortController 需额外配合)async/await(基于 Promise),写法接近同步,调试体验更好Promise 构造器包装,统一成 Promise 风格.then() 中又写深层回调,破坏 Promise 链的优势.catch() 且未开启 unhandledrejection 监听时,错误会被忽略