ホームページ ウェブフロントエンド jsチュートリアル vue axios リクエストのタイムアウトを処理する方法

vue axios リクエストのタイムアウトを処理する方法

Apr 08, 2018 pm 02:48 PM
axios 対処する どうやって

今回は、vue axios リクエストタイムアウトに対処する方法と、vue axios リクエストタイムアウトに対処する際の注意事項を紹介します。実際のケースを見てみましょう。

Vue2を使用して以来、APIを呼び出すために公式に推奨されているaxiosプラグインを使用していますが、使用中にサーバーまたはネットワークが不安定でパケットがドロップした場合、どのように対処すればよいでしょうか? 。

具体的な理由

最近、サーバー側のデータインターフェイスがPhpによって出力されたAPIを使用しているため、呼び出しプロセス中に暫定ヘッダーが表示されることがあります。

検索エンジンで与えられた解決策に従っても、私の問題は解決できません。

最近、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);
});
ログイン後にコピー

タイムアウト後、「Uncaught (in Promise) Error: timeout of xxx ms Overceed」エラーが報告されます。

catchではerror.requestエラーが返されるので、ここでリトライ機能を実行します。 テスト後、タイムアウト再リクエスト機能は実装できますが、 API をリクエストするすべてのページに再リクエストを設定する必要があるため、非常に面倒です。

上記を見てください、私のプロジェクトには数十の.vueファイルがあります。すべてのページにタイムアウトと再リクエスト機能を設定する必要がある場合、私は気が狂ってしまいます。

そして、このメカニズムには重大な問題があります。バグは、要求されたリンクが失敗したり、他の理由で正常にアクセスできない場合に、このメカニズムが失敗することです。設定した 6 秒を待たずに、毎秒数十回リクエストを更新し続けます。これは簡単です。下の図を参照してください。あっという間に 146 回のリクエストが行われました。

落とし穴のある解決策 2 は、タイムアウト後にエラー メッセージがインターセプター axios.interceptors.response にキャプチャされ、error.code = "ECONNABORTED "、特定のリンク

https://github.com/axios/axios/blob/26b06391f831ef98606ec0ed406d2be1742e9850/lib/adapters/xhr.js#L95-L101

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);
});
ログイン後にコピー

つまり、私のグローバルタイムアウト再取得ソリューションは次のようになります。

// Handle timeout
 request.ontimeout = function handleTimeout() {
  reject(createError('timeout of ' + config.timeout + 'ms exceeded', config, 'ECONNABORTED',
  request));
  // Clean up request
  request = null;
 };
ログイン後にコピー

このメソッドは新しいリクエストを実装することもできますが、2 つの問題があります。 1. 再リクエストは 1 回だけであり、再度タイムアウトになると停止し、再度リクエストされません。 2 番目の問題は、 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 

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);
	}
});
ログイン後にコピー

其他的那个几十个.vue页面的 this.$axios

完璧なソリューション🎜🎜🎜🎜 AOPプログラミングで必要なのは、axios.Interceptorsで熱心に取り組む必要があることです。axiosの問題で他の人からいくつかの解決策が見つかりました。 github で、最終的に次のような完璧な解決策が見つかりました。 🎜🎜 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 の取得と投稿メソッドは、コードをまったく変更する必要があります。 🎜

在这个过程中,谢谢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中文网其它相关文章!

推荐阅读:

webpack里脚手架优化的实现方法

Vue项目应该怎么分环境打包

webpack-dev-server的使用步奏

以上がvue axios リクエストのタイムアウトを処理する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

AI Hentai Generator

AI Hentai Generator

AIヘンタイを無料で生成します。

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

中国語版、とても使いやすい

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

WIN10サービスホストの動作プロセスがCPUを過剰に占有している WIN10サービスホストの動作プロセスがCPUを過剰に占有している Mar 27, 2024 pm 02:41 PM

1. まず、タスクバーの空白スペースを右クリックして[タスクマネージャー]オプションを選択するか、スタートロゴを右クリックして[タスクマネージャー]オプションを選択します。 2. 開いたタスク マネージャー インターフェイスで、右端の [サービス] タブをクリックします。 3. 開いた[サービス]タブで、下の[サービスを開く]オプションをクリックします。 4. 表示される[サービス]ウィンドウで、[InternetConnectionSharing(ICS)]サービスを右クリックし、[プロパティ]オプションを選択します。 5. 表示されたプロパティ画面で[プログラムから開く]を[無効]に変更し、[適用]をクリックして[OK]をクリックします。 6. スタートロゴをクリックし、シャットダウンボタンをクリックして[再起動]を選択し、コンピュータの再起動を完了します。

Excel データの Mysql へのインポートに関するよくある質問のまとめ: データのインポート時に発生したエラー ログの問題にどう対処するか? Excel データの Mysql へのインポートに関するよくある質問のまとめ: データのインポート時に発生したエラー ログの問題にどう対処するか? Sep 10, 2023 pm 02:21 PM

Excel データの Mysql へのインポートに関するよくある質問のまとめ: データのインポート時に発生したエラー ログの問題にどう対処するか? Excel データを MySQL データベースにインポートするのは一般的なタスクです。ただし、このプロセス中にさまざまなエラーや問題が発生することがよくあります。その 1 つはエラー ログの問題です。データをインポートしようとすると、システムは、発生したエラーに関する特定の情報をリストしたエラー ログを生成する場合があります。では、このような状況に遭遇した場合、エラーログにどのように対処すればよいのでしょうか?まず、その方法を知る必要があります

CSV ファイル操作のクイックガイド CSV ファイル操作のクイックガイド Dec 26, 2023 pm 02:23 PM

CSV 形式ファイルを開いて処理する方法を簡単に学習します。データ分析と処理の継続的な開発により、CSV 形式は広く使用されるファイル形式の 1 つになりました。 CSV ファイルは、さまざまなデータ フィールドがカンマで区切られた、シンプルで読みやすいテキスト ファイルです。学術研究、ビジネス分析、データ処理のいずれの場合でも、CSV ファイルを開いて処理する必要がある状況に頻繁に遭遇します。次のガイドでは、CSV 形式ファイルを開いて処理する方法をすぐに学ぶ方法を説明します。ステップ 1: CSV ファイル形式を理解する まず、

PHP で特殊文字を処理し、一重引用符を変換する方法を学習します。 PHP で特殊文字を処理し、一重引用符を変換する方法を学習します。 Mar 27, 2024 pm 12:39 PM

PHP 開発のプロセスでは、特殊文字の処理が一般的な問題になります。特に文字列処理では、特殊文字がエスケープされることがよくあります。その中でも、特殊文字を一重引用符に変換することは比較的一般的な要件です。これは、PHP では一重引用符が文字列をラップする一般的な方法であるためです。この記事では、PHP での特殊文字変換シングルクォーテーションの扱い方と具体的なコード例を説明します。 PHP では、特殊文字には一重引用符 (')、二重引用符 (")、バックスラッシュ () などが含まれますが、これらに限定されません。

C# 開発で XML および JSON データ形式を処理する方法 C# 開発で XML および JSON データ形式を処理する方法 Oct 09, 2023 pm 06:15 PM

C# 開発で XML および JSON データ形式を処理する方法には、特定のコード サンプルが必要です。現代のソフトウェア開発では、XML と JSON の 2 つのデータ形式が広く使用されています。 XML (Extensible Markup Language) はデータの保存と送信に使用されるマークアップ言語であり、JSON (JavaScript Object Notation) は軽量のデータ交換形式です。 C# 開発では、XML と JSON データの処理と操作が必要になることがよくありますが、この記事では、C# を使用してこれら 2 つのデータ形式を処理し、添付する方法に焦点を当てます。

Javaでjava.lang.UnsatisfiedLinkErrorエラーを処理する方法は? Javaでjava.lang.UnsatisfiedLinkErrorエラーを処理する方法は? Aug 24, 2023 am 11:01 AM

Java.lang.UnsatisfiedLinkError 例外は、アーキテクチャ、オペレーティング システム、またはライブラリのパス構成と参照されるものとの間の不一致により、ネイティブ メソッドまたはライブラリへのアクセスまたはロードが失敗した場合に、実行時に発生します。これは通常、アーキテクチャ、オペレーティング システム構成、またはパス構成に互換性がなく、成功を妨げていることを示します。通常、参照されているローカル ライブラリがシステムにインストールされているライブラリと一致せず、実行時に使用できません。このエラーを解決するには、キーはネイティブである必要があります。ライブラリはシステムと互換性があり、ライブラリ パス設定を通じてアクセスできます。ライブラリ ファイルが指定された場所に存在し、システム要件を満たしていることを確認する必要があります。 java.lang.UnsatisfiedLinkErrorjava.lang

PHP プロジェクトで API インターフェイスを呼び出してデータをクロールおよび処理するにはどうすればよいですか? PHP プロジェクトで API インターフェイスを呼び出してデータをクロールおよび処理するにはどうすればよいですか? Sep 05, 2023 am 08:41 AM

PHP プロジェクトで API インターフェイスを呼び出してデータをクロールおよび処理するにはどうすればよいですか? 1. はじめに PHP プロジェクトでは、多くの場合、他の Web サイトからデータをクロールし、これらのデータを処理する必要があります。多くの Web サイトでは API インターフェイスが提供されており、これらのインターフェイスを呼び出すことでデータを取得できます。この記事では、PHP を使用して API インターフェイスを呼び出し、データをクロールおよび処理する方法を紹介します。 2. API インターフェースの URL とパラメーターを取得する 開始する前に、ターゲット API インターフェースの URL と必要なパラメーターを取得する必要があります。

win7からwin10へのアップグレードに失敗した後、問題を解決するにはどうすればよいですか? win7からwin10へのアップグレードに失敗した後、問題を解決するにはどうすればよいですか? Dec 26, 2023 pm 07:49 PM

私たちが使用しているオペレーティングシステムがwin7の場合、一部の友人はアップグレード時にwin7からwin10へのアップグレードに失敗する可能性があります。編集者は、問題を解決できるかどうかを確認するために、アップグレードを再度試行できると考えています。詳細については、エディターが行ったことを見てみましょう~ win7 が wi​​n10 にアップグレードできない場合の対処方法 方法 1: 1. コンピューターが Win10 にアップグレードできるかどうかを評価するために、最初にドライバーをダウンロードすることをお勧めします。アップグレード後にドライバーテストを利用し、ドライバーに異常がないか確認し、ワンクリックで修正してください。方法 2: 1. C:\Windows\SoftwareDistribution\Download の下にあるすべてのファイルを削除します。 2.win+R「wuauclt.e」を実行

See all articles