JavaScript 异步编程是现代 Web 开发的核心概念。早期使用回调函数处理异步操作,但容易产生回调地狱。Promise 的出现改善了异步代码的可读性,async/await 进一步简化了异步代码的写法。
Promise 代表一个异步操作的最终完成或失败。new Promise 创建 Promise 对象,接受一个执行器函数作为参数。执行器函数接收 resolve 和 reject 两个参数,分别表示成功和失败。
Promise 有三种状态:pending(待定)、fulfilled(已兑现)、rejected(已拒绝)。状态一旦改变就不会再变。then 方法在状态变为 fulfilled 时执行,catch 方法在状态变为 rejected 时执行。
链式调用是 Promise 的重要特性。每个 then 返回新的 Promise,支持连续调用。返回值会传递给下一个 then。抛出错误会导致后续 catch 被调用。
Promise.all 接收 Promise 数组,并行执行所有异步操作。所有 Promise 都成功时返回结果数组,任一 Promise 失败则整体失败。适用于需要等待多个独立异步操作完成的场景。
Promise.race 类似 Promise.all,但只等待第一个完成的 Promise。Promise.any 等待第一个成功的 Promise,忽略失败。Promise.allSettled 等待所有 Promise 结束,无论成功或失败。
async 函数是返回 Promise 的函数。async 关键字声明异步函数。异步函数内部可以使用 await 关键字。async 函数即使不包含异步代码也返回 Promise。
await 关键字暂停异步函数的执行,等待 Promise 完成。只能在 async 函数内部使用。await Promise 等待 Promise fulfilled,返回 resolved 值。Promise rejected 时抛出错误。
错误处理使用 try-catch。await 语句包裹在 try 块中。catch 块捕获错误并处理。finally 块无论成功失败都执行。async/await 与 try-catch 结合是常见的异步错误处理模式。
并发执行使用 Promise.all。多个独立的异步操作应该同时启动。使用 Promise.all 等待所有完成。map 和 Promise.all 组合处理数组元素。
顺序执行使用 await 链式调用。需要等待前一个完成再执行下一个时使用。.reduce 配合 await 实现累加效果。for 循环配合 await 实现迭代执行。
异步迭代器处理流式数据。for await…of 遍历异步迭代器。ReadableStream 提供流式读取。生成器函数可以返回 Promise 实现异步迭代。
setTimeout 和 setInterval 是基础的定时操作。setTimeout 在指定毫秒后执行一次。setInterval 每隔指定毫秒重复执行。clearTimeout 和 clearInterval 取消定时。
setImmediate 和 process.nextTick 是 Node.js 的快速定时方法。setImmediate 在当前 IO 事件循环结束后执行。process.nextTick 在当前操作完成后立即执行。
事件循环机制理解异步执行顺序。调用栈执行同步代码。Promise 回调进入微任务队列。setTimeout 回调进入宏任务队列。每一轮事件循环先清空微任务队列,再处理宏任务。
Promise 常见问题包括忘记 return、错误处理不完整、串行而非并行等。Promise.all 需要确保所有 Promise 正确创建。catch 应该处理所有可能的错误。善用 Promise.all 并行执行独立任务。
浏览器中 fetch 是常用的异步请求方法。fetch 返回 Promise。response.ok 检查 HTTP 状态码。response.json 解析 JSON 数据。POST 请求需要设置 headers 和 body。
axios 是更强大的 HTTP 客户端。axios.request 配置详细请求。axios.get、axios.post 等快捷方法。支持请求和响应拦截器。支持取消请求和超时设置。
Web Workers 在后台线程执行代码。new Worker 创建 Worker 实例。postMessage 传递消息。onmessage 接收消息。Worker 中不能访问 DOM 和部分浏览器 API。
Service Worker 拦截网络请求。用于实现离线缓存、推送通知。生命周期包括安装、激活、fetch 事件。 Cache API 存储响应副本。
理解 JavaScript 异步编程需要时间。回调、Promise、async/await 各有适用场景。避免回调地狱使用 Promise 或 async/await。正确处理错误,确保程序健壮。
实践异步编程需要多写多调试。开发者工具 Network 面板查看网络请求。Sources 面板断点调试异步代码。console.log 输出中间状态。理解事件循环机制。
JavaScript 异步编程持续演进。Top-level await 在模块顶层直接使用 await。Atomics 和 SharedArrayBuffer 支持多线程。Temporal API 提供更好的日期时间处理。持续关注语言新特性。
掌握异步编程是 JavaScript 开发者的必备技能。理解 Promise 和 async/await 的原理。掌握错误处理和并发控制。积累实践经验,能够编写高效可靠的异步代码。
(本文为 JavaScript 技术系列文章的第 82 篇)











暂无评论内容