为什么选择做游戏网站做国外销售都上什么网站
JS 中 async/await 功能介绍与使用演示
一、功能介绍
-
基本概念
async:用于声明异步函数,返回一个Promise对象。即使函数内没有显式返回Promise,也会隐式将返回值封装为Promise.resolve()。await:仅能在async函数内部使用,用于等待Promise对象的解析(resolve)或拒绝(reject)。它使异步代码看起来类似同步代码,提升可读性。
-
核心特性
- 异步流程同步化:通过
await暂停函数执行,直到Promise完成,再继续后续逻辑。 - 错误传播:若
await后的Promise被拒绝(reject),会抛出错误,需用try/catch捕获。 - 兼容性:
async/await是 ES2017 引入的语法糖,底层基于Promise,兼容现代浏览器和 Node.js。
- 异步流程同步化:通过
-
使用场景
- 替代回调函数和
.then()链式调用,处理异步操作(如 API 请求、文件读写)。 - 串行或并行执行多个异步任务,优化代码结构。
- 替代回调函数和
二、使用演示
-
基础示例:顺序执行异步任务
// 模拟异步请求函数 function fetchData(url) {return new Promise((resolve) => {setTimeout(() => {resolve(`Data from ${url}`);}, 1000);}); }// 使用 async/await 顺序执行 async function fetchSequentially() {try {const data1 = await fetchData('api1');console.log(data1); // Data from api1const data2 = await fetchData('api2');console.log(data2); // Data from api2} catch (error) {console.error('Error:', error);} }fetchSequentially(); -
并发执行异步任务
使用Promise.all并行处理多个请求,减少总耗时:async function fetchConcurrently() {try {const [data1, data2] = await Promise.all([fetchData('api1'),fetchData('api2')]);console.log(data1, data2); // 同时输出两个结果} catch (error) {console.error('Error:', error);} }fetchConcurrently(); -
错误处理
结合try/catch捕获异步错误:async function fetchWithErrorHandling() {try {const response = await fetch('https://invalid.url');const data = await response.json(); // 如果响应失败,此处会抛错} catch (error) {console.error('Caught error:', error);} }fetchWithErrorHandling(); -
实用场景:模拟延迟执行
实现休眠函数:function delay(ms) {return new Promise((resolve) => setTimeout(resolve, ms)); }async function delayedTask() {console.log('Task started');await delay(2000); // 暂停2秒console.log('Task completed'); }delayedTask();
三、注意事项
-
await的局限性- 只能在
async函数内使用,否则会抛出语法错误。 - 后面可以是任意表达式(如字符串、数值),非
Promise会被自动封装为Promise.resolve()。
- 只能在
-
错误处理
- 未捕获的
reject会导致async函数返回的Promise变为reject状态,需用try/catch或.catch()处理。
- 未捕获的
-
性能优化
- 避免过度串行:连续使用
await会导致异步任务串行执行,降低性能。可改用Promise.all并发处理无关依赖的任务。 - 不要阻塞主线程:长时间同步操作(如循环)中滥用
await可能阻塞渲染,需谨慎设计异步流程。
- 避免过度串行:连续使用
四、总结
async/await 是 JavaScript 异步编程的语法糖,本质是基于 Promise,但提供了更简洁、易读的代码风格。它适用于大多数异步场景,尤其适合需要顺序执行或并发控制的场景。使用时需注意错误处理和性能优化,避免陷入同步思维的误区。
