以下是同步与异步的核心区别总结:
同步(Synchronous)
顺序阻塞:任务按代码顺序依次执行,必须等待前一个任务完成后才能执行下一个。
示例:
javascript复制console.log("1"); console.log("2"); // 必须等上一行执行完才会运行
异步(Asynchronous)
非阻塞并行:任务发起后不等待结果,继续执行后续代码,通过回调、Promise 等方式在完成后处理结果。
示例:
javascript复制console.log("1"); setTimeout(() => { console.log("2"); }, 1000); // 异步任务,1秒后执行console.log("3"); // 立即输出,不等待定时器
同步:
简单的数学计算、同步文件读写(如 Node.js 的 readFileSync
)。
需要严格保证执行顺序的场景(如数据库事务)。
异步:
网络请求(AJAX、Fetch API)、定时器(setTimeout
)、事件监听(点击、滚动)。
文件读写(Node.js 的 readFile
)、高耗时操作(避免阻塞主线程)。
同步:
可能阻塞主线程:长时间任务会导致界面卡顿(如浏览器中 JS 同步循环会冻结页面)。
代码简单直观:易于理解和调试。
异步:
高效利用资源:主线程不被阻塞,适合处理并发任务(如同时处理多个网络请求)。
代码复杂度高:需要处理回调嵌套(回调地狱)、错误处理(如 try/catch
对异步无效)。
特性 | 同步 | 异步 |
---|---|---|
控制流 | 线性执行,顺序明确 | 非线性,依赖回调或事件驱动 |
线程占用 | 独占主线程 | 通过事件循环(Event Loop)管理 |
错误处理 | 可直接用 try/catch | 需在回调或 .catch() 中处理 |
适用语言 | 所有语言 | 单线程语言(如 JS)的核心特性 |
同步:在餐厅排队点餐,必须等前一个人点完才能轮到你。
异步:扫码下单后继续做其他事,餐好了系统通知你取餐。
同步:简单但低效,适合轻量级任务。
异步:高效但复杂,适合 I/O 密集型或高延迟操作。
前端中的异步:通过事件循环、Promise、async/await
实现无阻塞交互(如页面动态加载数据)。