在vue中axios设置timeout超时的操作

当使用axios在Vue中进行数据请求时,可能会遇到服务器响应非常缓慢或者出现网络问题等情况,由此导致前端请求一直在等待响应,造成用户体验不佳。为了解决这类问题,我们可以通过设置axios的timeout超时时间来规定前端在等待响应的最大时间,如果超过这个时间则取消请求,并且返回一个错误提示。

下面是设置axios timeout的完整攻略和两条示例说明:

设置全局 timeout

我们可以通过axios的默认配置来全局设置timeout,这样所有的axios请求都会拥有相同的超时时间,可以在Vue项目中的main.js中进行如下设置:

import axios from 'axios'

axios.defaults.timeout = 10000 // 设置默认的超时时间,单位是毫秒

Vue.prototype.$http = axios

在上述代码中,我们将axios请求的默认超时时间设置为10秒。如果我们在实际请求中不需要设置其他超时时间,就可以直接使用该全局配置。

设置单个请求的 timeout

有时候我们可能需要针对某个特定的请求来设置超时时间。在这种情况下,我们可以在请求的config中增加一个timeout属性来设置超时时间,如下所示:

axios.get('/api/user', { 
  params: { 
    id: 12345 
  },
  timeout: 5000 // 设置该请求的超时时间为5秒
}).then(response => {
  console.log(response.data)
}).catch(error => {
  console.log(error.message)
})

上述代码中,我们在get请求的config中增加了timeout属性,并将超时时间设置为5秒。

示例1:完整代码

<template>
  <div>
    {{ message }}
  </div>
</template>

<script>
import axios from 'axios'

export default {
  name: 'Example',
  data() {
    return {
      message: ''
    }
  },
  created() {
    axios.get('/api/user', {
      params: {
        id: 12345
      },
      timeout: 5000
    }).then(response => {
      this.message = response.data
    }).catch(error => {
      console.log(error.message)
    })
  }
}
</script>

上述代码中,我们在Vue组件的created生命周期中发送了一个get请求,并设置了超时时间为5秒。请求成功后,将响应结果赋值给组件中的message。

示例2:防止超时重复发送

在实际使用中,可能会遇到在请求超时之后,希望重新发送请求的情况。这时候我们可以在axios的interceptors拦截器中进行处理。

axios.interceptors.response.use(
  response => {
    return response
  },
  error => {
    if (axios.isCancel(error)) {
      console.log('Request canceled:', error.message)
    } else if (error.code === 'ECONNABORTED') {
      console.log('Request timeout!')
      handleTimeout(error.config) // 处理超时事件
    } else {
      console.log('Request error:', error.message)
      return Promise.reject(error)
    }
  }
)

let pendingRequests = new Map() // 存储正在进行的请求
let CancelToken = axios.CancelToken

function handleTimeout(config) {
  let key = getRequestKey(config)
  let request = pendingRequests.get(key)
  if (request) {
    request.cancel('Timeout!') // 取消该请求
    pendingRequests.delete(key)
    sendRequest(config) // 重新发送请求
  }
}

function getRequestKey(config) {
  return [config.method, config.url, JSON.stringify(config.params)].join('&')
}

function sendRequest(config) {
  let key = getRequestKey(config)
  let request = axios.request(config)
  request.then(response => {
    pendingRequests.delete(key)
    return response
  }).catch(error => {
    pendingRequests.delete(key)
    return Promise.reject(error)
  })
  pendingRequests.set(key, request)
}

export default {
  get(url, params, timeout = 5000) {
    let config = {
      method: 'get',
      url: url,
      params: params,
      timeout: timeout,
      cancelToken: new CancelToken(function executor(cancel) {
        let key = getRequestKey(config)
        if (pendingRequests.has(key)) {
          cancel('Request canceled')
        } else {
          pendingRequests.set(key, {cancel})
        }
      })
    }
    return sendRequest(config)
  },
  post(url, data, timeout = 5000) {
    let config = {
      method: 'post',
      url: url,
      data: data,
      timeout: timeout,
      cancelToken: new CancelToken(function executor(cancel) {
        let key = getRequestKey(config)
        if (pendingRequests.has(key)) {
          cancel('Request canceled')
        } else {
          pendingRequests.set(key, {cancel})
        }
      })
    }
    return sendRequest(config)
  }
}

上述代码中我们使用了一个pendingRequests的Map来存储正在进行的请求,每个请求的key是由请求的method、url和params组成的。当第一次发送一个请求时,我们将它加入pendingRequests中,同时创建一个cancelToken,并在cancelToken中设置一个executor,在executor中判断该请求是否已经在pendingRequests中存在。如果已经存在则调用其cancel方法取消请求。如果不存在就将一个{cancel}对象加入pendingRequests中。

当请求超时后,我们可以在拦截器的错误处理函数中通过判断error.code是否为‘ECONNABORTED’来判断该请求是否超时。如果请求超时,我们可以通过getRequestKey函数获取该请求的key,并在pendingRequests中获取该请求对象。然后我们会取消该请求,并调用sendRequest函数重新发送同样的请求,并更新pendingRequests。

最后,我们在axios使用过程中不再调用axios的方法,而是调用我们自身的get和post方法,这两个方法内部包含了超时重发的逻辑。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:在vue中axios设置timeout超时的操作 - Python技术站

(0)
上一篇 2023年5月29日
下一篇 2023年5月29日

相关文章

  • Vue项目使用svg图标实践

    Vue项目使用SVG图标实践 本文主要介绍在Vue项目中如何使用SVG图标,并提供两个示例说明。 集成SVG图标 安装svg-sprite-loader svg-sprite-loader将svg文件打包成单个svg sprite,该svg sprite可以通过样式或相关API的方式在您的应用程序中使用。 npm install svg-sprite-loa…

    Vue 2023年5月27日
    00
  • Vue中使用 Echarts5.0 遇到的一些问题(vue-cli 下开发)

    当在Vue项目中使用Echarts5.0时,可能会遇到以下问题: 1. 需要手动引入echarts.min.js 如需在vue组件中使用echarts5.0,应先手动引入echarts.min.js。可以通过NPM或从cdn获取: npm install echarts –save 然后在Vue组件中引入echarts.min.js: import ech…

    Vue 2023年5月29日
    00
  • Vue 实现穿梭框功能的详细代码

    实现穿梭框功能需要依赖于 Vue.js 框架和一些 UI 组件库,本文以 element-ui 为例,给出一份详细的代码实现攻略。下面是具体步骤: 步骤一:引入 Element UI 首先,在 index.html 中引入 Element UI: <link rel="stylesheet" href="https://u…

    Vue 2023年5月28日
    00
  • 如何使用vue开发公众号网页

    下面我将详细讲解如何使用Vue开发公众号网页的完整攻略。 步骤一:创建Vue项目 首先,我们需要使用Vue CLI工具来创建一个新的Vue项目。Vue CLI是一个标准的脚手架工具,能够帮助我们快速创建Vue应用。 安装Vue CLI: npm install -g @vue/cli 创建一个新的Vue项目: vue create my-app 步骤二:安装…

    Vue 2023年5月28日
    00
  • Vue2项目升级到Vue3的详细教程

    Vue2项目升级到Vue3的详细教程 Vue3是当前最新的Vue版本,它拥有更好的性能和更多的特性。如果你有一个Vue2项目,想要升级到Vue3,那么请按照以下步骤进行操作: 步骤一:备份代码 在进行升级操作前,请务必备份好你的代码。如果升级失败,你可以通过备份的代码恢复到原来的状态。 步骤二:安装Vue3相关依赖 在package.json文件中修改”vu…

    Vue 2023年5月27日
    00
  • 详解VUE的状态控制与延时加载刷新

    详解VUE的状态控制与延时加载刷新 在Vue中,状态控制和延时加载刷新是非常常见的需求。下面我将针对这两个问题进行详细讲解。 状态控制 在Vue中,状态控制可以通过data属性来进行。对于一个组件内需要使用的状态变量,我们可以先在data对象中定义: data() { return { count: 0, message: ‘Hello Vue!’ } } …

    Vue 2023年5月29日
    00
  • Vue中对watch的理解(关键是immediate和deep属性)

    Vue中的watch选项可以用来监听数据的变化,并在数据变化时执行一些自定义的操作。它包括了一些属性,如immediate和deep,这些属性可以帮助我们更好地控制watch的行为。 immediate immediate属性表示在实例被创建时,是否立即执行一次watcher回调函数。默认情况下,watch回调函数是在第一次数据变化之后执行的,但是如果需要在…

    Vue 2023年5月27日
    00
  • 详解Vue的钩子函数(路由导航守卫、keep-alive、生命周期钩子)

    Vue的钩子函数 Vue的钩子函数是Vue.js提供的一种功能,我们可以使用这些函数在组件的生命周期中绑定自定义行为。Vue的钩子函数可以分为两类,一个是系统内置的,一个是我们可以在组件中自定义的。其中,系统内置的钩子函数被称为生命周期钩子,用来在组件的不同生命周期中,执行不同的操作。 路由导航守卫 Vue的路由导航守卫,是Vue中的一种钩子函数,用于控制路…

    Vue 2023年5月27日
    00
合作推广
合作推广
分享本页
返回顶部