如何取消上一次的请求

在前端开发中,我们经常会遇到需要发送异步请求的情况。而在某些场景下,我们可能会需要取消之前已经发送的请求,例如在用户频繁切换页面或者输入框搜索时,需要取消上一次的请求,以避免不必要的网络请求和处理。

本文将通过介绍 axios 如何取消上一次的请求,并给出一个实际问题的解决方案。

什么是 axios?

axios 是一个基于 Promise 的 HTTP 客户端,用于发送请求和处理响应。它可以在浏览器和 Node.js 中使用,支持拦截请求和响应,提供便捷的 API。

如何使用 axios 发送请求和取消请求?

首先,我们需要安装 axios,可以通过 npm 或者 yarn 安装:

npm install axios

然后,在需要使用的地方引入 axios:

import axios from 'axios';

接下来,我们来看一下如何发送请求和取消请求。

发送请求

通过 axios 发送请求非常简单,只需要调用对应的方法即可。以下是一个发送 GET 请求的示例:

axios.get('/api/data')
  .then(response => {
    console.log(response.data);
  })
  .catch(error => {
    console.error(error);
  });

在上面的例子中,我们通过 axios 发送了一个 GET 请求,请求的 URL 是 /api/data。然后,我们通过 then 方法来处理请求成功的响应,并通过 catch 方法来处理请求失败的情况。

取消请求

要取消上一次的请求,我们需要使用 axios 提供的 CancelToken。CancelToken 是一个工厂函数,用于创建一个取消令牌。

首先,我们需要创建一个 CancelToken 实例,并将它作为请求的配置参数之一。然后,我们可以调用 CancelToken 实例的 cancel 方法来取消请求。以下是一个取消请求的示例:

import axios from 'axios';

// 创建 CancelToken 实例
const CancelToken = axios.CancelToken;
let cancel;

// 发送请求
axios.get('/api/data', {
  cancelToken: new CancelToken(function executor(c) {
    // 保存取消函数
    cancel = c;
  })
})
  .then(response => {
    console.log(response.data);
  })
  .catch(error => {
    // 如果请求被取消,会进入这里
    if (axios.isCancel(error)) {
      console.log('Request canceled', error.message);
    } else {
      console.error(error);
    }
  });

// 取消请求
cancel('Operation canceled by the user.');

在上面的例子中,我们通过传递一个 executor 函数给 CancelToken 来创建一个取消令牌。在 executor 函数中,我们可以通过参数 c 来调用取消函数 cancel

如果在请求发送之前调用了 cancel 函数,那么请求就会被取消。当请求被取消时,catch 方法中的回调函数会接收一个 Cancel 类型的异常对象。

示例:取消上一次的请求

现在,我们来看一个实际问题的例子:用户在输入框中搜索关键字时,我们需要根据关键字发送请求来获取搜索结果。由于用户可能频繁输入和删除关键字,我们需要取消之前的请求,只发送最新的请求。

首先,我们需要创建一个输入框和一个搜索函数,代码如下:

<input type="text" id="search" />
<button id="search-btn">Search</button>
import axios from 'axios';

// 保存取消函数
let cancel;

// 搜索函数
function search() {
  // 取消上一次的请求
  if (typeof cancel === 'function') {
    cancel('Operation canceled by the user.');
  }

  // 保存取消函数
  const CancelToken = axios.CancelToken;
  cancel = CancelToken.source().cancel;

  // 获取输入框的值
  const keyword = document.getElementById('search').value;

  // 发送请求
  axios.get('/api/search', {
    params: {
      keyword
    },
    cancelToken: new CancelToken(function executor(c) {
      // 保存取消函数
      cancel = c;
    })
  })
    .then(response => {
      console.log(response.data);
    })
    .catch(error => {
      // 如果请求被取消,会进入这里
      if (axios.isCancel(error)) {
        console.log('Request canceled', error.message);
      } else {
        console.error