await
是 JavaScript 中的一个关键字,用于处理异步操作。它只能在 async
函数中使用,并用于暂停代码的执行,直到一个 Promise
完成(无论是成功 resolve
还是失败 reject
)。await
可以使异步代码看起来像同步代码,从而提高可读性和可维护性。
1. 基本用法
await
用于等待一个 Promise
的完成,并返回 Promise
的结果。以下是一个简单的例子:
示例:使用 await
和 async
// 一个异步函数,返回一个 Promise
function fetchData() {
return new Promise((resolve) => {
setTimeout(() => {
resolve('Data fetched');
}, 2000); // 模拟一个耗时 2 秒的异步操作
});
}
// 使用 async 声明一个异步函数
async function getData() {
console.log('Fetching data...');
// 使用 await 等待 fetchData 完成
const data = await fetchData();
console.log(data); // 输出: 'Data fetched'
}
getData();
2. await
的作用
- 暂停执行:
await
会暂停所在的async
函数中的代码执行,直到等待的Promise
完成。上面的例子中,getData
在执行到await fetchData()
时,会等待fetchData
返回的Promise
完成,然后将结果赋值给data
,再继续执行后续的代码。 - 简化异步操作:
await
使得异步代码写起来像同步代码,从而避免了传统的“回调地狱”或者过度使用.then()
的链式调用。
3. 错误处理
await
也可以与 try...catch
一起使用来捕获异步操作中的错误:
示例:错误处理
// 一个异步函数,返回一个 Promise
function fetchDataWithError() {
return new Promise((_, reject) => {
setTimeout(() => {
reject('An error occurred while fetching data');
}, 2000);
});
}
async function getDataWithErrorHandling() {
try {
console.log('Fetching data...');
// 使用 await 等待 fetchDataWithError 完成
const data = await fetchDataWithError();
console.log(data);
} catch (error) {
console.error('Error:', error); // 输出: 'Error: An error occurred while fetching data'
}
}
getDataWithErrorHandling();
在这个例子中,await fetchDataWithError()
会抛出错误,该错误被 try...catch
捕获并处理。
4. 注意事项
async
和 await
让异步编程更加简洁、直观,是现代 JavaScript 中处理异步操作的重要工具。
-
必须在
async
函数中使用:await
只能在声明为async
的函数中使用。尝试在非async
函数中使用await
会导致语法错误。 -
// 错误示例:await 只能在 async 函数中使用 function incorrectUsage() { const result = await fetchData(); // SyntaxError: Unexpected identifier }
await
会阻塞当前async
函数的执行:await
会暂停当前async
函数的执行,直到Promise
完成。其他不受影响的代码仍会继续执行。例如: -
async function process() { console.log('Start'); await new Promise(resolve => setTimeout(resolve, 2000)); // 等待 2 秒 console.log('End'); } process(); console.log('This will log before "End"');
-
在这个例子中,"This will log before 'End'" 会在
"End"
打印之前被输出,因为await
只暂停process
函数,而不会阻塞整个程序的执行。 -
5. 并行执行
当需要并行执行多个异步操作时,可以使用
Promise.all()
来同时等待多个Promise
,而不是逐个await
。例如: -
async function fetchData1() { return new Promise(resolve => setTimeout(() => resolve('Data 1 fetched'), 2000)); } async function fetchData2() { return new Promise(resolve => setTimeout(() => resolve('Data 2 fetched'), 1000)); } async function fetchAllData() { // 使用 Promise.all 并行执行多个异步操作 const [data1, data2] = await Promise.all([fetchData1(), fetchData2()]); console.log(data1); // 输出: 'Data 1 fetched' console.log(data2); // 输出: 'Data 2 fetched' } fetchAllData();
在这个例子中,
fetchData1()
和fetchData2()
是并行执行的,总耗时为两者中最长的那一个(2 秒),而不是它们的总和(3 秒)。6. 返回值
await
表达式的返回值是被等待的Promise
完成后的结果。它也可以用于非Promise
的值,如果传递给await
的不是一个Promise
,它会直接返回这个 -
async function getValue() { const value = await 42; console.log(value); // 输出: 42 } getValue();
总结
await
用于暂停async
函数中的代码执行,等待Promise
完成,并返回其结果。- 它只能在
async
函数中使用,不能在全局或普通函数中使用。 - 结合
try...catch
来处理错误,更加直观且简洁。 - 可以利用
Promise.all()
进行并行的异步操作,提高执行效率。