vue axios 요청 시간 초과를 처리하는 방법
이번에는 vue axios 요청 시간 초과 처리 방법과 vue axios 요청 시간 초과 처리 시 주의사항은 무엇인지 알려드리겠습니다. 실제 사례를 살펴보겠습니다.
Vue2를 사용하면서 공식적으로 추천하는 axios 플러그인을 사용해 API를 호출했는데, 사용 중 서버나 네트워크가 불안정하고 패킷이 끊기는 경우 어떻게 대처해야 할까요? .
특정 이유
최근에 회사에서 프로젝트를 진행 중인데, PHP의 API 출력을 사용합니다. Google Chrome에 임시 헤더가 표시되는 경우가 있습니다.
검색엔진에서 제공하는 해결 방법으로는 문제가 해결되지 않습니다.
최근 AOP 개발 및 프로그래밍 개념과 axios에서 언급되는 컬럼 인터셉터(axios.Interceptors)에 대해 공부하고 있습니다. 개발 지침 코드 결합을 줄이고, 프로그램 재사용성을 향상시키며, 개발 효율성을 높이는 것은 바로 이 메커니즘이어야 합니다.
함정이 있는 해결 방법 1
제 경험은 제한되어 있고 제가 할 수 있는 유일한 일은 Axios 요청 시간이 초과된 후 새로운 요청을 하는 것뿐입니다. Axios의 사용 지침을 연구하여 타임아웃 = 6000
axios.defaults.timeout = 6000;
을 설정한 다음 열 인터셉터를 추가합니다.
// Add a request interceptor axios.interceptors.request.use(function (config) { // Do something before request is sent return config; }, function (error) { // Do something with request error return Promise.reject(error); }); // Add a response interceptor axios.interceptors.response.use(function (response) { // Do something with response data return response; }, function (error) { // Do something with response error return Promise.reject(error); });
이 열 인터셉터의 역할은 요청 타임아웃 후 정보를 캡처하고 다음 단계로 이동합니다. 즉, 재요청을 사용하고 싶습니다.
관련 페이지 데이터 요청은 다음과 같습니다.
this.$axios.get(url, {params:{load:'noload'}}).then(function (response) { //dosomething(); }).catch(error => { //超时之后在这里捕抓错误信息. if (error.response) { console.log('error.response') console.log(error.response); } else if (error.request) { console.log(error.request) console.log('error.request') if(error.request.readyState == 4 && error.request.status == 0){ //我在这里重新请求 } } else { console.log('Error', error.message); } console.log(error.config); });
시간 초과 후, 포착되지 않음(약속 있음) 오류: 시간 초과 xxx ms 초과 오류가 보고됩니다.
catch에서는 error.request 오류를 반환하므로 여기서 재시도 기능을 수행하게 되는데, 테스트 후 재요청 기능을 구현할 수도 있지만, 매우 번거롭습니다. API를 요청하는 모든 페이지에서 다시 요청을 설정해야 합니다.
위를 보면 내 프로젝트에 수십 개의 .vue 파일이 있습니다. 모든 페이지에서 시간 초과 및 재요청 기능을 설정해야 한다면 정말 미칠 것 같습니다.
그리고 이 메커니즘에는 심각한 문제가 있습니다. 버그는 요청한 링크가 실패하거나 다른 이유로 인해 정상적으로 액세스할 수 없는 경우 이 메커니즘이 실패한다는 것입니다. 내가 설정한 6초 동안 기다리지 않고 계속 새로 고쳐지며 1초에 수십 번씩 요청하므로 쉽습니다. 아래 사진을 보시면 눈 깜짝할 사이에 146번 요청을 하셨습니다.
함정이 있는 두 번째 솔루션
은 Axios의 소스 코드를 연구했습니다. 시간 초과 후 오류 메시지는 인터셉터 axios.interceptors.response에 캡처되며 error.code = "ECONNABORTED ", 특정 링크
https://github.com/axios/axios/blob/26b06391f831ef98606ec0ed406d2be1742e9850/lib/adapters/xhr.js#L95-L101
// Handle timeout request.ontimeout = function handleTimeout() { reject(createError('timeout of ' + config.timeout + 'ms exceeded', config, 'ECONNABORTED', request)); // Clean up request request = null; };
그래서 저의 글로벌 타임아웃 재획득 솔루션은 이렇습니다.
axios.interceptors.response.use(function(response){ .... }, function(error){ var originalRequest = error.config; if(error.code == 'ECONNABORTED' && error.message.indexOf('timeout')!=-1 && !originalRequest._retry){ originalRequest._retry = true return axios.request(originalRequest); } });
이 방법도 새로운 요청을 구현할 수 있지만 두 가지 문제가 있습니다. 1. 한 번만 다시 요청하면 다시 시간이 초과되면 중지되고 다시 요청하지 않습니다. 두 번째 문제는 this.$axios.get(url).then
이후의 작업과 같이 데이터 요청으로 각 페이지에서 많은 작업을 수행한다는 것입니다. this.$axios.get(url).then
之后操作。
完美的解决方法
以AOP编程方式,我需要的是一个 超时重新请求的全局功能, 要在axios.Interceptors下功夫,在github的axios的issue找了别人的一些解决方法,终于找到了一个完美解决方案,就是下面这个。
https://github.com/axios/axios/issues/164#issuecomment-327837467
//在main.js设置全局的请求次数,请求的间隙 axios.defaults.retry = 4; axios.defaults.retryDelay = 1000; axios.interceptors.response.use(undefined, function axiosRetryInterceptor(err) { var config = err.config; // If config does not exist or the retry option is not set, reject if(!config || !config.retry) return Promise.reject(err); // Set the variable for keeping track of the retry count config.retryCount = config.retryCount || 0; // Check if we've maxed out the total number of retries if(config.retryCount >= config.retry) { // Reject with the error return Promise.reject(err); } // Increase the retry count config.retryCount += 1; // Create new promise to handle exponential backoff var backoff = new Promise(function(resolve) { setTimeout(function() { resolve(); }, config.retryDelay || 1); }); // Return the promise in which recalls axios to retry the request return backoff.then(function() { return axios(config); }); });
其他的那个几十个.vue页面的 this.$axios
import axios from 'axios'; //安装方法 npm install axios //或 bower install axios
this.$axios
가져오기 및 게시 방법은 그렇지 않습니다. 코드를 전혀 수정해야 합니다. 🎜在这个过程中,谢谢jooger给予大量的技术支持,这是他的个人信息 https://github.com/jo0ger , 谢谢。
以下是我做的一个试验。。把axios.defaults.retryDelay = 500, 请求 www.facebook.com
如有更好的建议,请告诉我,谢谢。
补充:
axios基本用法
vue更新到2.0之后,作者就宣告不再对vue-resource更新,而是推荐的axios,前一段时间用了一下,现在说一下它的基本用法。
首先就是引入axios,如果你使用es6,只需要安装axios模块之后
import axios from 'axios'; //安装方法 npm install axios //或 bower install axios
当然也可以用script引入
axios提供了一下几种请求方式
axios.request(config) axios.get(url[, config]) axios.delete(url[, config]) axios.head(url[, config]) axios.post(url[, data[, config]]) axios.put(url[, data[, config]]) axios.patch(url[, data[, config]])
这里的config是对一些基本信息的配置,比如请求头,baseURL,当然这里提供了一些比较方便配置项
//config import Qs from 'qs' { //请求的接口,在请求的时候,如axios.get(url,config);这里的url会覆盖掉config中的url url: '/user', // 请求方法同上 method: 'get', // default // 基础url前缀 baseURL: 'https://some-domain.com/api/', transformRequest: [function (data) { // 这里可以在发送请求之前对请求数据做处理,比如form-data格式化等,这里可以使用开头引入的Qs(这个模块在安装axios的时候就已经安装了,不需要另外安装) data = Qs.stringify({}); return data; }], transformResponse: [function (data) { // 这里提前处理返回的数据 return data; }], // 请求头信息 headers: {'X-Requested-With': 'XMLHttpRequest'}, //parameter参数 params: { ID: 12345 }, //post参数,使用axios.post(url,{},config);如果没有额外的也必须要用一个空对象,否则会报错 data: { firstName: 'Fred' }, //设置超时时间 timeout: 1000, //返回数据类型 responseType: 'json', // default }
有了配置文件,我们就可以减少很多额外的处理代码也更优美,直接使用
axios.post(url,{},config) .then(function(res){ console.log(res); }) .catch(function(err){ console.log(err); }) //axios请求返回的也是一个promise,跟踪错误只需要在最后加一个catch就可以了。 //下面是关于同时发起多个请求时的处理 axios.all([get1(), get2()]) .then(axios.spread(function (res1, res2) { // 只有两个请求都完成才会成功,否则会被catch捕获 }));
最后还是说一下配置项,上面讲的是额外配置,如果你不想另外写也可以直接配置全局
axios.defaults.baseURL = 'https://api.example.com'; axios.defaults.headers.common['Authorization'] = AUTH_TOKEN; axios.defaults.headers.post['Content-Type'] = 'application/x-www-form-urlencoded'; //当然还可以这么配置 var instance = axios.create({ baseURL: 'https://api.example.com' });
本文只是介绍基本的用法,详细看官方文档https://github.com/axios
我写的两个例子:
使用vue2.0+mintUI+axios+vue-router: https://github.com/Stevenzwzhai/vue-mobile-application
使用vue2.0+elementUI+axios+vue-router: https://github.com/Stevenzwzhai/vue2.0-elementUI-axios-vueRouter, 之前由于没做后端接口,所以运行没数据,现在加了mockjs来返回一些数据,以便于参考。
相信看了本文案例你已经掌握了方法,更多精彩请关注php中文网其它相关文章!
推荐阅读:
위 내용은 vue axios 요청 시간 초과를 처리하는 방법의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

핫 AI 도구

Undresser.AI Undress
사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover
사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool
무료로 이미지를 벗다

Clothoff.io
AI 옷 제거제

AI Hentai Generator
AI Hentai를 무료로 생성하십시오.

인기 기사

뜨거운 도구

메모장++7.3.1
사용하기 쉬운 무료 코드 편집기

SublimeText3 중국어 버전
중국어 버전, 사용하기 매우 쉽습니다.

스튜디오 13.0.1 보내기
강력한 PHP 통합 개발 환경

드림위버 CS6
시각적 웹 개발 도구

SublimeText3 Mac 버전
신 수준의 코드 편집 소프트웨어(SublimeText3)

뜨거운 주제











1. 먼저 작업 표시줄의 빈 공간을 마우스 오른쪽 버튼으로 클릭하고 [작업 관리자] 옵션을 선택하거나, 시작 로고를 마우스 오른쪽 버튼으로 클릭한 후 [작업 관리자] 옵션을 선택합니다. 2. 열린 작업 관리자 인터페이스에서 맨 오른쪽에 있는 [서비스] 탭을 클릭합니다. 3. 열린 [서비스] 탭에서 아래의 [서비스 열기] 옵션을 클릭하세요. 4. 열리는 [서비스] 창에서 [InternetConnectionSharing(ICS)] 서비스를 마우스 오른쪽 버튼으로 클릭한 후 [속성] 옵션을 선택하세요. 5. 열리는 속성 창에서 [연결 프로그램]을 [사용 안 함]으로 변경하고 [적용]을 클릭한 후 [확인]을 클릭하세요. 6. 시작 로고를 클릭한 후 종료 버튼을 클릭하고 [다시 시작]을 선택한 후 컴퓨터를 다시 시작합니다.

Excel 데이터를 Mysql로 가져오는 것에 대해 자주 묻는 질문 요약: 데이터를 가져올 때 발생하는 오류 로그 문제를 처리하는 방법은 무엇입니까? Excel 데이터를 MySQL 데이터베이스로 가져오는 것은 일반적인 작업입니다. 그러나 이 과정에서 우리는 종종 다양한 오류와 문제에 직면하게 됩니다. 그 중 하나는 오류 로그 문제입니다. 데이터를 가져오려고 하면 시스템은 발생한 오류에 대한 구체적인 정보를 나열하는 오류 로그를 생성할 수 있습니다. 그렇다면 이런 상황이 발생하면 오류 로그를 어떻게 처리해야 할까요? 먼저, 방법을 알아야 합니다.

CSV 형식 파일을 열고 처리하는 방법을 빠르게 배우십시오. 데이터 분석 및 처리의 지속적인 개발로 인해 CSV 형식은 널리 사용되는 파일 형식 중 하나가 되었습니다. CSV 파일은 다양한 데이터 필드가 쉼표로 구분되어 있는 간단하고 읽기 쉬운 텍스트 파일입니다. 학술 연구, 비즈니스 분석, 데이터 처리 등 CSV 파일을 열고 처리해야 하는 상황에 자주 직면하게 됩니다. 다음 가이드는 CSV 형식 파일을 열고 처리하는 방법을 빠르게 배우는 방법을 보여줍니다. 1단계: CSV 파일 형식 이해하기 먼저,

PHP 개발 과정에서 특수 문자를 처리하는 것은 일반적인 문제이며, 특히 문자열 처리에서는 특수 문자가 이스케이프되는 경우가 많습니다. 그중에서도 특수 문자를 작은따옴표로 변환하는 것은 상대적으로 일반적인 요구 사항입니다. 왜냐하면 PHP에서는 작은따옴표가 문자열을 래핑하는 일반적인 방법이기 때문입니다. 이 기사에서는 PHP에서 특수 문자 변환 작은따옴표를 처리하는 방법을 설명하고 구체적인 코드 예제를 제공합니다. PHP에서 특수 문자에는 작은따옴표('), 큰따옴표("), 백슬래시() 등이 포함되지만 이에 국한되지는 않습니다.

C# 개발에서 XML 및 JSON 데이터 형식을 처리하려면 특정 코드 예제가 필요합니다. 최신 소프트웨어 개발에서는 XML과 JSON이 널리 사용되는 두 가지 데이터 형식입니다. XML(Extensible Markup Language)은 데이터를 저장하고 전송하는 데 사용되는 마크업 언어인 반면, JSON(JavaScript Object Notation)은 경량 데이터 교환 형식입니다. C# 개발에서는 XML 및 JSON 데이터를 처리하고 조작해야 하는 경우가 많습니다. 이 기사에서는 C#을 사용하여 이 두 가지 데이터 형식을 처리하고 첨부하는 방법에 중점을 둘 것입니다.

Java.lang.UnsatisfiedLinkError 예외는 해당 아키텍처, 운영 체제 또는 라이브러리 경로 구성과 참조된 구성 간의 불일치로 인해 기본 메소드 또는 라이브러리에 액세스하거나 로드하려는 시도가 실패할 때 런타임에 발생합니다. 일반적으로 성공을 방해하는 아키텍처, 운영 체제 구성 또는 경로 구성과의 비호환성이 있음을 나타냅니다. 일반적으로 참조된 로컬 라이브러리는 시스템에 설치된 라이브러리와 일치하지 않으며 런타임 시 사용할 수 없습니다. 핵심은 기본적으로 라이브러리가 시스템과 호환되며 라이브러리 경로 설정을 통해 액세스할 수 있다는 것입니다. 라이브러리 파일이 지정된 위치에 있고 시스템 요구 사항을 충족하는지 확인해야 합니다. java.lang.UnsatisfiedLinkErrorjava.lang

PHP 프로젝트에서 API 인터페이스를 호출하여 데이터를 크롤링하고 처리하는 방법은 무엇입니까? 1. 소개 PHP 프로젝트에서는 종종 다른 웹사이트에서 데이터를 크롤링하고 이러한 데이터를 처리해야 합니다. 많은 웹사이트에서는 API 인터페이스를 제공하며, 우리는 이러한 인터페이스를 호출하여 데이터를 얻을 수 있습니다. 이 기사에서는 PHP를 사용하여 API 인터페이스를 호출하여 데이터를 크롤링하고 처리하는 방법을 소개합니다. 2. API 인터페이스의 URL과 매개변수를 얻으십시오. 시작하기 전에 대상 API 인터페이스의 URL과 필수 매개변수를 얻어야 합니다.

우리가 사용하는 운영 체제가 win7인 경우 일부 친구는 업그레이드할 때 win7에서 win10으로 업그레이드하지 못할 수도 있습니다. 편집자는 문제가 해결될 수 있는지 확인하기 위해 다시 업그레이드를 시도해 볼 수 있다고 생각합니다. 자세한 내용은 편집자가 어떻게 했는지 살펴보겠습니다~ win7이 win10으로 업그레이드하지 못한 경우 방법 1: 1. 먼저 드라이버를 다운로드하여 컴퓨터를 Win10으로 업그레이드할 수 있는지 평가하는 것이 좋습니다. 업그레이드 후 드라이버 테스트를 이용하여 드라이버에 이상이 있는지 확인하고 원클릭으로 수정하세요. 방법 2: 1. C:\Windows\SoftwareDistribution\Download 아래의 모든 파일을 삭제합니다. 2.win+R 실행 "wuauclt.e
