JavaScript异步编程需理解执行时机、调用栈与事件循环;回调易致嵌套地狱、错误难捕获、无法取消;Promise解耦执行时机与逻辑,.then()总异步、.catch()仅捕获前序rejection;async/await是Promise语法糖,须async声明,await后非Promise自动包装,错误需try/catch捕获。

JavaScript 的异步编程不是靠“学会回调函数”就能搞定的,而是要理解执行时机、调用栈和事件循环如何共同作用——回调函数只是最基础(也最容易出错)的表达方式。
为什么直接写回调会陷入“地狱”
嵌套多层 callback 不仅难读,更致命的是错误处理分散、控制流断裂、无法用 try/catch 捕获异步错误。
- 常见现象:
Uncaught TypeError: cb is not a function,因为上层忘了传回调或传了undefined - 错误无法冒泡:在回调里抛出的错误不会被外层
try捕获 - 无法统一取消:没有标准机制中断正在等待的回调链
- 参数顺序不一致:Node.js 风格是
(err, data),浏览器 API 多是success和error两个回调
Promise 是回调的替代方案,不是语法糖
Promise 把“何时执行”和“执行什么”解耦,提供可组合、可捕获、可链式调用的异步抽象。
- 必须用
new Promise()构造,且内部必须调用resolve()或reject(),否则状态永远是pending -
.then()总是异步执行(即使 Promise 已fulfilled),这是规范保证,避免竞态 -
.catch()只捕获前一个环节的 rejection,不捕获同步错误(除非在.then()回调里抛出) - 示例:
fetch('/api/user')
.then(res => res.json())
.then(data => console.log(data))
.catch(err => console.error('请求失败:', err));
async/await 的真实约束条件
async/await 只是 Promise 的语法包装,它不能让任意函数变“异步”,也不能脱离 Promise 生态独立工作。
AJAX即“Asynchronous Javascript And XML”(异步JavaScript和XML),是指一种创建交互式网页应用的网页开发技术。它不是新的编程语言,而是一种使用现有标准的新方法,最大的优点是在不重新加载整个页面的情况下,可以与服务器交换数据并更新部分网页内容,不需要任何浏览器插件,但需要用户允许JavaScript在浏览器上执行。《php中级教程之ajax技术》带你快速
立即学习“Java免费学习笔记(深入)”;
- 函数必须声明为
async,否则await会报SyntaxError -
await后面如果不是 Promise,会被自动包装成Promise.resolve(value) - 错误必须用
try/catch捕获,await不会把 rejection 转成 throw 给外层同步上下文 - 并行执行要显式用
Promise.all([p1, p2]),写成await p1; await p2就是串行
真正容易被忽略的点
异步代码的调试难点不在写法,而在时序判断——比如 setTimeout(() => {}, 0) 并不等于“立刻执行”,它会在当前任务完成后、微任务队列清空后才进宏任务队列;而 Promise.then() 属于微任务,优先级更高。实际项目中,混淆这两者会导致状态更新丢失、UI 渲染异常、竞态条件难以复现。










