异步编程

JavaScript 在浏览器与 Node 中均以单线程事件循环为主流模型:长时间计算会阻塞,因此 I/O、计时、用户交互等多用异步 API,配合回调、ES6+Promiseasync / await 组织流程。


回调(Callback)

readFile('a.txt', (err, data) => {
  if (err) return handle(err)
  // ...
})
  • 错误优先(Node 风格)约定第一个参数为 err
  • 嵌套过深形成回调地狱;可读性与异常传播较差。

Promise

三态pendingfulfilledrejected;仅 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 函数总是返回 Promiseawait暂停当前 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,见 模块化


相关链接

  • 事件机制(任务、浏览器事件与异步边界的配合)
  • ES6+(语言层面的 Promise、async
  • 函数(高阶函数、回调形态)
  • DOM与BOMfetch、计时器、requestAnimationFrame
  • 性能优化(避免主线程长任务、合理使用异步切片)