JavaScript异步编程核心是依场景选机制:Promise用于链式异步逻辑与错误统一捕获,async/await提升流程可读性,setTimeout等仅控执行时机;需确保Promise构造器调用resolve/reject、fetch手动判response.ok、await对象必须为Promise、microtask(如then)优先于macrotask(如setTimeout)执行。

JavaScript 实现异步编程,核心不是“选哪种写法”,而是「根据场景选对机制」——Promise 适合封装异步逻辑,async/await 适合组织可读流程,而 setTimeout 或 requestIdleCallback 这类 API 则用于控制执行时机,不能替代真正的异步 I/O。
什么时候该用 Promise 而不是回调函数?
当你需要链式处理多个异步步骤(比如:请求用户数据 → 再请求其权限 → 最后渲染),又不想陷入“回调地狱”时,Promise 是基础解法。它把嵌套回调转为扁平的 .then() 链,并统一错误捕获入口。
-
new Promise构造函数里必须调用resolve或reject,漏掉会导致 pending 状态卡死 - 不要在
Promise构造器里直接 throw 错误——这不会触发catch,要用reject(new Error(...)) -
fetch默认不拒绝网络错误(如 404、500),需手动检查response.ok
async/await 为什么不能直接 await 普通函数?
async/await 只是 Promise 的语法糖,它等待的是“thenable”对象。如果函数返回非 Promise,await 会立即解包并继续执行,起不到暂停效果。
- 常见误写:
async function foo() { return doSomething(); }—— 若doSomething()返回普通值,await foo()不会异步等待 - 正确做法:确保被 await 的函数明确返回
Promise,例如return fetch(url)或return new Promise(...) -
await只能在async函数内使用,顶层 await 仅在 ES Module 和某些运行环境(如 Node.js 14.8+)中支持
事件循环里,Promise.then 和 setTimeout 哪个先执行?
Promise.then 回调属于 microtask,setTimeout 属于 macrotask;一次事件循环中,microtask 队列会在当前任务结束后、下一个 macrotask 开始前清空。这意味着:
JS特效就是网页中实现的特殊效果或者特殊的功能的一种技术,是用网页脚本(javascript)来编写制作动态特殊效果,比如图片切换,渐变等等,它为网页活跃了网页的气氛,有时候会起到一定的亲切力。务(控制台应用程序、桌面应用程序、WEB应用程序等)
立即学习“Java免费学习笔记(深入)”;
- 哪怕
setTimeout(fn, 0)先注册,Promise.then仍会先执行 - 连续多个
then会按顺序立刻执行,不等下一轮循环 - 这个差异会影响状态更新顺序,比如 Vue/React 中
await nextTick()就依赖 microtask 保证 DOM 更新完成
真正容易被忽略的点是:异步不是“让代码跑得更快”,而是“不让阻塞蔓延”。一个没处理 rejection 的 Promise,或一个忘记 await 的 async 调用,都会让错误静默丢失——这类问题在线上往往只暴露为“界面卡住但控制台无报错”。










