好看简洁的logo设计windows优化大师官方网站
async/await
是 JavaScript 中用于处理异步操作的强大语法,它建立在 Promise
的基础之上,让异步代码看起来更像是同步代码,提高了代码的可读性和可维护性。以下是详细的知识点、丰富的例子以及常用方法:
1. async
函数
async
是一个关键字,用于定义异步函数。异步函数总是返回一个 Promise
对象。如果函数内部没有显式地返回一个 Promise
,那么会返回一个已解决(resolved)状态的 Promise
,其值为函数的返回值。
示例:
async function asyncFunction() {return '这是一个异步函数的返回值';
}const resultPromise = asyncFunction();
console.log(resultPromise instanceof Promise); // true
resultPromise.then(value => console.log(value)); // 输出: 这是一个异步函数的返回值
2. await
表达式
await
只能在 async
函数内部使用。它会暂停 async
函数的执行,直到其等待的 Promise
被解决(resolved)或被拒绝(rejected)。当 Promise
被解决时,await
表达式会返回 Promise
的解决值;当 Promise
被拒绝时,会抛出异常。
示例:
function fetchData() {return new Promise((resolve) => {setTimeout(() => {resolve('数据已获取');}, 1000);});
}async function getData() {const data = await fetchData();console.log(data); // 输出: 数据已获取return data;
}getData();
3. 错误处理
在 async/await
中,通常使用 try...catch
语句来捕获和处理异步操作中抛出的异常。
示例:
function fetchDataWithError() {return new Promise((_, reject) => {setTimeout(() => {reject('数据获取失败');}, 1000);});
}async function getDataWithError() {try {const data = await fetchDataWithError();console.log(data);} catch (error) {console.error('捕获到错误:', error);}
}getDataWithError();
4. 多个异步操作的顺序执行
当有多个 async
操作需要顺序执行时,可以在 async
函数中依次使用多个 await
表达式。
示例:
function step1() {return new Promise((resolve) => {setTimeout(() => {resolve('步骤1完成');}, 1000);});
}function step2() {return new Promise((resolve) => {setTimeout(() => {resolve('步骤2完成');}, 1000);});
}async function executeSteps() {const result1 = await step1();console.log(result1);const result2 = await step2();console.log(result2);
}executeSteps();
5. 多个异步操作的并发执行
可以使用 Promise.all
方法来实现多个异步操作的并发执行,然后在 async
函数中使用 await
等待所有 Promise
都完成。
示例:
function task1() {return new Promise((resolve) => {setTimeout(() => {resolve('任务1完成');}, 1500);});
}function task2() {return new Promise((resolve) => {setTimeout(() => {resolve('任务2完成');}, 1000);});
}async function executeTasks() {const [result1, result2] = await Promise.all([task1(), task2()]);console.log(result1);console.log(result2);
}executeTasks();
6. 常用方法总结
Promise.all
:接受一个Promise
数组作为参数,当所有Promise
都成功时,返回一个包含所有Promise
解决值的数组;只要有一个Promise
失败,整个Promise.all
就会失败。Promise.race
:接受一个Promise
数组作为参数,只要数组中有一个Promise
率先解决或拒绝,就返回该Promise
的结果。try...catch
:用于捕获async
函数中await
表达式可能抛出的异常,进行错误处理。
通过 async/await
结合这些方法,可以灵活地处理各种复杂的异步场景,使异步代码更加简洁和易于理解。