HoRain云--JavaScript async/await

发布时间:2026/7/27 15:13:42
HoRain云--JavaScript async/await 在讲解 async/await 之前我们需要先理解 JavaScript 中的异步编程概念可以参考JavaScript 是单线程语言意味着它一次只能执行一个任务。为了避免长时间运行的任务阻塞主线程JavaScript 使用异步编程模型。异步 vs 同步同步Synchronous编程代码按顺序执行前一个操作完成后才会执行下一个异步编程Asynchronous某些操作被放入任务队列主线程继续执行后续代码等主线程空闲时再处理队列中的任务实例// 同步示例console.log(1);console.log(2);// 输出: 1, 2// 异步示例console.log(1);setTimeout(() console.log(2), 0);console.log(3);// 输出: 1, 3, 2回调函数的问题在 async/await 出现之前JavaScript 主要使用回调函数处理异步操作但这会导致回调地狱Callback Hell。实例getData(function(a) {getMoreData(a, function(b) {getMoreData(b, function(c) {getMoreData(c, function(d) {console.log(d);});});});});这种嵌套结构使得代码难以阅读和维护。Promise 的引入ES6 引入了 Promise 对象来解决回调地狱问题。实例function getData() {return new Promise((resolve, reject) {// 异步操作setTimeout(() resolve(数据), 1000);});}getData().then(data {console.log(data);return getMoreData(data);}).then(moreData {console.log(moreData);}).catch(error {console.error(error);});虽然 Promise 改善了回调问题但 then() 链式调用仍然不够直观。async/await 语法ES2017 引入了 async/await它建立在 Promise 之上让异步代码看起来像同步代码一样。async 函数在函数声明前添加 async 关键字表示该函数是异步的async function fetchData() {// 函数体}async 函数总是返回一个 Promise如果返回值不是 Promise会自动包装成 resolved Promise如果抛出异常会返回 rejected Promiseawait 表达式await 只能在 async 函数内部使用async function fetchData() {const result await somePromise;console.log(result);}await 会暂停 async 函数的执行等待 Promise 完成如果 Promise 被 resolve返回 resolve 的值如果 Promise 被 reject抛出错误可以用 try/catch 捕获实际应用示例基本用法实例function delay(ms) {return new Promise(resolve setTimeout(resolve, ms));}async function showMessage() {console.log(开始);await delay(1000);console.log(1秒后);await delay(1000);console.log(又1秒后);}showMessage();错误处理实例async function fetchUserData() {try {const response await fetch(https://api.example.com/user);if (!response.ok) {throw new Error(网络响应不正常);}const data await response.json();console.log(data);} catch (error) {console.error(获取数据失败:, error);}}并行执行如果需要并行执行多个异步操作可以使用 Promise.all实例async function fetchMultipleData() {const [userData, productData] await Promise.all([fetch(/api/user),fetch(/api/products)]);const user await userData.json();const products await productData.json();return { user, products };}常见问题与最佳实践1. 不要忘记 await实例// 错误示例 - 忘记 awaitasync function example() {const data fetch(/api); // 缺少 awaitconsole.log(data); // 输出 Promise 对象}// 正确示例async function example() {const data await fetch(/api);console.log(data); // 输出实际数据}2. 避免不必要的 async实例// 不必要 - 函数内部没有 awaitasync function unnecessaryAsync() {return 42;}// 更简单的写法function simpleFunction() {return 42;}3. 顶层 await在模块顶层可以直接使用 awaitES2022 特性实例// 在模块中const data await fetch(/api);console.log(data);4. 性能考虑顺序执行 vs 并行执行合理使用 Promise.all 提高性能错误处理确保所有可能的错误都被捕获async/await 与传统 Promise 对比特性async/awaitPromise then/catch可读性高类似同步代码中链式调用错误处理使用 try/catch使用 .catch()调试更容易有明确的调用栈较困难调用栈可能不清晰代码结构更扁平嵌套或链式总结async/await 是 JavaScript 异步编程的重大改进它使异步代码更易读、更易维护基于 Promise与现有 Promise 代码兼容提供了更直观的错误处理方式改善了调试体验虽然 async/await 不是完全替代 Promise但在大多数情况下它提供了更优雅的解决方案。理解 async/await 的工作原理和最佳实践将大大提升你的 JavaScript 异步编程能力。