• 主页

  • 投资

  • IT

    🔥
  • 设计

  • 销售

  • 共299篇

    前端 - Javascript

关闭

返回栏目

关闭

返回前端 - Javascript栏目

148 - async/await - await 关键字 - await 的使用条件与效果

作者:

贺及楼

成为作者

更新日期:2025-02-21 20:08:41

async/await - await 关键字 - await 的使用条件与效果

在 JavaScript 异步编程的世界里,async/await 是一对强大的组合,它们为开发者提供了一种更加直观、简洁的方式来处理异步操作。其中,await 关键字扮演着至关重要的角色,本文将深入探讨 await 的使用条件与效果。

1. await 的基本概念

await 关键字只能在 async 函数内部使用。它的主要作用是暂停 async 函数的执行,直到所等待的 Promise 被解决(resolved)或被拒绝(rejected),然后返回 Promise 的解决值。这使得异步代码看起来就像同步代码一样,极大地提高了代码的可读性和可维护性。

2. await 的使用条件

2.1 必须在 async 函数内部

这是使用 await 最基本的条件。如果在非 async 函数中使用 await,会导致语法错误。以下是一个简单的示例:

  1. // 错误示例:在非 async 函数中使用 await
  2. // 以下代码会报错
  3. // function normalFunction() {
  4. // const promise = new Promise((resolve) => {
  5. // setTimeout(() => {
  6. // resolve('Promise resolved');
  7. // }, 1000);
  8. // });
  9. // const result = await promise;
  10. // console.log(result);
  11. // }
  12. // 正确示例:在 async 函数中使用 await
  13. async function asyncFunction() {
  14. const promise = new Promise((resolve) => {
  15. setTimeout(() => {
  16. resolve('Promise resolved');
  17. }, 1000);
  18. });
  19. const result = await promise;
  20. console.log(result);
  21. }
  22. asyncFunction();

2.2 等待的对象必须是 Promise

await 后面通常跟着一个 Promise 对象。如果不是 Promise 对象,await 会将其视为已经解决的 Promise,并立即返回该值。示例如下:

  1. async function testAwait() {
  2. // 等待一个普通值
  3. const value = await 10;
  4. console.log(value); // 输出: 10
  5. // 等待一个 Promise
  6. const promise = new Promise((resolve) => {
  7. setTimeout(() => {
  8. resolve('Promise resolved');
  9. }, 1000);
  10. });
  11. const result = await promise;
  12. console.log(result); // 输出: Promise resolved
  13. }
  14. testAwait();

3. await 的效果

3.1 暂停函数执行

await 遇到一个 Promise 时,它会暂停 async 函数的执行,直到该 Promise 被解决或被拒绝。这使得代码可以按顺序执行异步操作,而不需要使用复杂的回调函数或链式调用。

  1. async function sequentialTasks() {
  2. console.log('Task 1 started');
  3. const promise1 = new Promise((resolve) => {
  4. setTimeout(() => {
  5. resolve('Task 1 completed');
  6. }, 1000);
  7. });
  8. const result1 = await promise1;
  9. console.log(result1);
  10. console.log('Task 2 started');
  11. const promise2 = new Promise((resolve) => {
  12. setTimeout(() => {
  13. resolve('Task 2 completed');
  14. }, 1000);
  15. });
  16. const result2 = await promise2;
  17. console.log(result2);
  18. }
  19. sequentialTasks();

在上述代码中,await 确保了 Task 2 会在 Task 1 完成后才开始执行。

3.2 异常处理

await 可以与 try...catch 语句结合使用,方便地处理 Promise 被拒绝的情况。

  1. async function handleErrors() {
  2. try {
  3. const promise = new Promise((resolve, reject) => {
  4. setTimeout(() => {
  5. reject(new Error('Promise rejected'));
  6. }, 1000);
  7. });
  8. const result = await promise;
  9. console.log(result);
  10. } catch (error) {
  11. console.error('Error:', error.message);
  12. }
  13. }
  14. handleErrors();

3.3 简化链式调用

在处理多个嵌套的 Promise 链式调用时,await 可以让代码更加简洁易读。

  1. // 传统的 Promise 链式调用
  2. function getData() {
  3. return new Promise((resolve) => {
  4. setTimeout(() => {
  5. resolve('Data from API');
  6. }, 1000);
  7. });
  8. }
  9. function processData(data) {
  10. return new Promise((resolve) => {
  11. setTimeout(() => {
  12. resolve(data.toUpperCase());
  13. }, 1000);
  14. });
  15. }
  16. // 传统方式
  17. // getData()
  18. // .then(processData)
  19. // .then((result) => {
  20. // console.log(result);
  21. // })
  22. // .catch((error) => {
  23. // console.error(error);
  24. // });
  25. // 使用 async/await
  26. async function main() {
  27. try {
  28. const data = await getData();
  29. const processedData = await processData(data);
  30. console.log(processedData);
  31. } catch (error) {
  32. console.error(error);
  33. }
  34. }
  35. main();

4. 总结

使用条件 说明
必须在 async 函数内部 否则会导致语法错误
等待的对象必须是 Promise 若不是 Promise,会将其视为已解决的 Promise 并立即返回该值
效果 说明
暂停函数执行 确保异步操作按顺序执行
异常处理 可结合 try...catch 语句处理 Promise 被拒绝的情况
简化链式调用 让处理多个嵌套的 Promise 链式调用的代码更简洁易读

通过掌握 await 的使用条件与效果,开发者可以更加高效地编写异步代码,提升代码的质量和可维护性。