Axios如何实现同步请求(async与await)

Axios介绍

Axios是一个基于promise的网络请求库,可以用在浏览器和 node.js中。

Axios本质上也是对原生XHR的封装,只不过它是Promise的实现版本。

主要特点:
从浏览器创建 XMLHttpRequests
从 node.js 创建 http 请求
支持 Promise API
拦截请求和响应
转换请求和响应数据
取消请求
自动转换JSON数据
客户端支持防御XSRF

在axios中,所有的请求都是异步发送的。所以单独用axios是实现不了同步的,需要结合async与await关键字使用。

axios应用

axios发起get请求示例一:

const axios = require("axios");
// 向给定ID的用户发起请求
axios.get("/user?ID=12345")
  .then(function (response) {
    // 处理成功情况
    console.log(response);
  })
  .catch(function (error) {
    // 处理错误情况
    console.log(error);
  })
  .finally(function () {
    // 总是会执行
  });

axios发起get请求示例二:

// 上述请求也可以按以下方式完成(可选)
axios.get("/user", {
    params: {
      ID: 12345
    }
  })
  .then(function (response) {
    console.log(response);
  })
  .catch(function (error) {
    console.log(error);
  })
  .finally(function () {
    // 总是会执行
  });

axios发起post请求:

axios.post("/user", {
    firstName: "Fred",
    lastName: "Flintstone"
  })
  .then(function (response) {
    console.log(response);
  })
  .catch(function (error) {
    console.log(error);
  });

使用async/await用法,实现同步请求

async function getUser() {
  try {
    const response = await axios.get('/user?id=12345');
    console.log(response);
  } catch (error) {
    console.error(error);
  }
}

说明:使用async/await修饰的方法getUser内部为同步逻辑,即只有当请求响应回来之后,才会继续之后的console.log(response)或console.error(error)打印操作。

注意:调用getUser()方法的地方仍为异步操作,并不会因为getUser()方法内部为同步请求而阻塞当前进程。例如:

while循环中调用getUser方法:

let _this = this;
let i = 0;
while (i < 4) {
  console.log("请求" + i + "开始...");
  _this.getUser();
  console.log("请求" + i + "结束");
  i++;
}

打印日志为:

请求0开始...
请求0结束
请求1开始...
请求1结束
请求2开始...
请求2结束
请求3开始...
请求3结束
{msg: '操作成功', code: 200, permissions: Array(1), roles: Array(1), user: {…}}
{msg: '操作成功', code: 200, permissions: Array(1), roles: Array(1), user: {…}}
{msg: '操作成功', code: 200, permissions: Array(1), roles: Array(1), user: {…}}
{msg: '操作成功', code: 200, permissions: Array(1), roles: Array(1), user: {…}}

可以看到循环里面,第一个请求响应回来之前,之后的请求就接着执行;如果我们希望整个循环接口请求串行执行,即第一个请求响应回来之后,再发起第二次请求,则我们同样需要使用async和await来对while循环进行修饰,保证while循环里面的代码串行执行,达到我们想要的目的。代码如下:

// 同步循环请求
(async() => {
  let j = 0;
  while (j < this.form.requestCount) {
    console.log('请求' + j + "开始...");
    await _this.getUser();
    console.log('请求' + j + "结束");
    j++;
  }
})();

打印日志如下:

请求0开始...
{msg: '操作成功', code: 200, permissions: Array(1), roles: Array(1), user: {…}}
请求0结束
请求1开始...
{msg: '操作成功', code: 200, permissions: Array(1), roles: Array(1), user: {…}}
请求1结束
请求2开始...
{msg: '操作成功', code: 200, permissions: Array(1), roles: Array(1), user: {…}}
请求2结束
请求3开始...
{msg: '操作成功', code: 200, permissions: Array(1), roles: Array(1), user: {…}}
请求3结束

如上所示,即达到了我们接口串行执行的目的。

Vue
最后修改于:2022年10月02日 10:12

添加新评论