前端(十二)——深入理解和使用 async和await

简介: 前端(十二)——深入理解和使用 async和await

你可能遇到的问题

声明一个变量,用axios请求后,把请求结果中的数据给这个变量。然后去使用这个变量,发现这个变量里是空的。但是当把这个这串代码放在定时器里几秒后,就能打印到。但如果网络不好,请求花的时间更多,那么你还是打印不到。你遇到过这个情况吗?如何拿到值呢?或者如何等到接口请求完,再去向下执行?

这边牵扯到一个同步和异步的问题,那么axios是异步的非阻塞模式。如何将axios请求由异步变为同步,这就需要asyncawait配合使用。

做到这一点,你才能保证必须让程序按照从上到下的顺序执行,你也就能拿到值了。

async function init() {
  let salesData = [];
  const res = await axios({
    method: "post",
    url: "要请求的接口",
    data: {}
  });
}
 console.log(res.data.data);
 salesData = res.data.data;

如果你着急解决问题,那么上面的代码示例就已经帮你解决了问题。如果你有时间,要深入了解,那么请往下看:


什么是 async/await

async/await 是基于 Promise 的一种语法糖,它提供了一种更优雅的方式来编写异步代码。通过使用 async 关键字声明一个异步函数,我们可以在其中使用 await 关键字等待 Promise 对象的解决(resolved)或拒绝(rejected),使得代码看起来更像是同步的方式进行编写和阅读。


基本用法

  1. async 声明 使用 async 关键字声明一个异步函数。异步函数内部可以包含 await 表达式。
async function fetchData() {
  // 异步操作
}
• 1
• 2
• 3
  1. await 表达式 在异步函数内部,可以使用 await 关键字等待一个 Promise 对象,并返回其 resolved 的结果。这样,在 await 表达式之后的代码将会等待该 Promise 对象解决,然后继续执行。
async function fetchData() {
  const result = await somePromise; // 等待 Promise 对象执行完毕
  console.log(result); // 输出已解决的结果
} 

await后面放axios也是可以的,原因无他。

仅因为axios 是一个基于 Promise 的 HTTP 客户端库,它提供了更丰富、更方便的功能来发送 Ajax 请求和处理响应。而 Promise 则是一种通用的处理异步操作的对象,可以在各种场景下使用,并通过链式调用的方式来处理异步操作的结果。


错误处理

  1. 通过将 await 表达式放在 try-catch 块中,可以捕获异步操作抛出的错误,并进行相应的处理。
async function fetchData() {
  try {
    const result = await somePromise;
    console.log(result);
  } catch (error) {
    console.error(error);
  }
}
  1. 在 async 函数内部,如果需要抛出一个错误并将其封装为 Promise.reject(),可以使用 throw 关键字。
async function fetchData() {
  throw new Error('请求失败');
}

并行执行多个异步操作

  • 若有多个独立的异步操作,我们可以使用 Promise.all() 方法来并行执行它们,并等待所有异步操作都完成后获取结果。
async function fetchMultipleData() {
  const promise1 = fetch(url1);
  const promise2 = fetch(url2);
  const [result1, result2] = await Promise.all([promise1, promise2]);
  console.log(result1, result2);
}

async/await 与同步代码混用

  1. 同步代码中使用 await 在一个异步函数内部,我们可以使用 await 关键字来等待异步操作的结果,但是也可以将其用于同步操作,使得代码逻辑更加清晰。
async function doSomething() {
  const result = await syncFunction(); // 等待一个同步函数执行完毕
  console.log(result);
}
  1. async 函数调用 我们可以在同步代码中调用异步函数,虽然这样的调用本身是异步的,但我们可以将它视为一个同步操作,并根据需要等待其结果。
function syncFunction() {
  const result = await asyncFunction(); // 等待一个异步函数执行完毕
  console.log(result);
}

axios 和 Promise 的相同点

  • 异步操作:无论是 Axios 还是 Promise,它们都用于处理异步操作。Axios 通过发送 HTTP 请求和处理响应来实现异步操作,而 Promise 是一种通用的处理异步操作的对象,可以在各种场景下使用。
  • 基于 Promise:Axios 是基于 Promise 的,它返回的是一个 Promise 对象。Promise 提供了一种更优雅、可读性更好的方式来处理异步代码。
  • 错误处理:无论是 Axios 还是 Promise,它们都提供了错误处理的机制。Axios 可以捕获请求错误和响应错误,并将错误信息封装成一个统一的错误对象返回。Promise 通过 reject 状态来表示异步操作失败,并能够使用 .catch() 方法来捕获并处理错误。

总结

当我们遇到需要代码加载顺序必须同步时,也就是执行顺序必须由上而下,等中间代码执行完毕才能向下执行时。

我们需要用async和await来介入,他们的配合使用,可以使异步变为同步,多用于改变接口请求等异步操作。

相关文章
|
5月前
|
前端开发 JavaScript 开发者
前端开发中的异步编程:Promise 和 Async/Await 的比较与应用
在现代前端开发中,异步编程是不可或缺的技术。本文将深入探讨Promise和Async/Await这两种主流的异步编程方式,分析它们的优劣势及在实际项目中的应用场景。通过比较它们的语法、可读性和错误处理机制,帮助开发者更好地选择和理解如何在项目中高效地利用这些技术。
|
6月前
|
前端开发 JavaScript 开发者
No102.精选前端面试题,享受每天的挑战和学习(async/await)
No102.精选前端面试题,享受每天的挑战和学习(async/await)
|
3月前
|
前端开发 JavaScript 开发者
探索前端开发中的异步编程:Promise与Async/Await
在现代前端开发中,处理异步操作是至关重要的。本文将深入探讨异步编程的核心概念,重点比较JavaScript中的Promise与Async/Await两种异步编程方式。通过实例和比较,读者将能够理解这两种方法的优缺点,如何在实际开发中选择适合的异步编程模式,从而编写更简洁、可维护的代码。
|
6月前
|
前端开发 JavaScript UED
前端 js 经典:async 和 await
前端 js 经典:async 和 await
73 2
|
6月前
|
Dart 前端开发 API
【Flutter前端技术开发专栏】Flutter中的异步编程与Future/async/await
【4月更文挑战第30天】本文探讨了Flutter中的异步编程,强调其在提高应用响应性和性能上的重要性。Flutter使用`Future`对象表示异步操作的结果,通过`.then()`和`.catchError()`处理异步任务。此外,Dart的`async/await`关键字简化了异步代码,使其更易读。理解并运用这些概念对于开发高效的Flutter应用至关重要。
47 0
【Flutter前端技术开发专栏】Flutter中的异步编程与Future/async/await
|
6月前
|
前端开发 JavaScript
前端JavaScript中异步的终极解决方案:async/await
在深入讨论 async/await 之前,我们需要了解一下 JavaScript 的单线程和非阻塞的特性。JavaScript 是单线程的,也就是说在任何给定的时间点,只能执行一个操作。然而,对于需要大量时间的操作(例如从服务器获取数据),如果没有适当的管理机制,这种单线程特性可能会导致应用程序的阻塞。为了解决这个问题,JavaScript 引入了回调函数和后来的 Promise,用来管理这些异步操作。
|
6月前
|
前端开发 JavaScript 开发者
【面试题】前端人70%以上 不了解的promise/async await
【面试题】前端人70%以上 不了解的promise/async await
135 0
|
30天前
|
存储 人工智能 前端开发
前端大模型应用笔记(三):Vue3+Antdv+transformers+本地模型实现浏览器端侧增强搜索
本文介绍了一个纯前端实现的增强列表搜索应用,通过使用Transformer模型,实现了更智能的搜索功能,如使用“番茄”可以搜索到“西红柿”。项目基于Vue3和Ant Design Vue,使用了Xenova的bge-base-zh-v1.5模型。文章详细介绍了从环境搭建、数据准备到具体实现的全过程,并展示了实际效果和待改进点。
127 2
|
30天前
|
JavaScript 前端开发 程序员
前端学习笔记——node.js
前端学习笔记——node.js
37 0
|
30天前
|
人工智能 自然语言处理 运维
前端大模型应用笔记(一):两个指令反过来说大模型就理解不了啦?或许该让第三者插足啦 -通过引入中间LLM预处理用户输入以提高多任务处理能力
本文探讨了在多任务处理场景下,自然语言指令解析的困境及解决方案。通过增加一个LLM解析层,将复杂的指令拆解为多个明确的步骤,明确操作类型与对象识别,处理任务依赖关系,并将自然语言转化为具体的工具命令,从而提高指令解析的准确性和执行效率。