异步编程
JavaScript 在浏览器与 Node 中均以单线程事件循环为主流模型:长时间计算会阻塞,因此 I/O、计时、用户交互等多用异步 API,配合回调、ES6+ 的 Promise 与 async / await 组织流程。
回调(Callback)
readFile('a.txt', (err, data) => {
if (err) return handle(err)
// ...
})- 错误优先(Node 风格)约定第一个参数为
err。 - 嵌套过深形成回调地狱;可读性与异常传播较差。
Promise
三态:pending、fulfilled、rejected;仅 settled 一次。
fetch('/api')
.then((r) => r.json())
.then(console.log)
.catch(console.error)Promise.all:全部成功才 resolve,任一 reject 则失败。Promise.allSettled:等待全部结束,适合「无论成败都要知道结果」。Promise.race:第一个 settle 的结果。Promise.any:任一 fulfill;全失败则AggregateError。
微任务:then / catch 回调在微任务队列,通常早于下一轮宏任务(setTimeout 等)。与 事件机制、DOM与BOM 中的浏览器调度一起理解更清晰。
async / await
async 函数总是返回 Promise;await 会暂停当前 async 函数(不阻塞主线程其他任务),等待 Promise 结果。
async function load() {
try {
const r = await fetch('/api')
return await r.json()
} catch (e) {
// reject 与 throw 都会进这里
}
}await非 Promise 的值会按 Promise 规则包装。- 并行:无关请求用
Promise.all([a(), b()])再await,避免无谓串行。
与模块化
动态 import() 返回 Promise,见 模块化。