序文実際のプロジェクトでは、リクエストに対して「手ぶれ防止」処理を実行する必要がある場合があります。これは主に、特定の状況下でユーザーが短時間にボタンを繰り返しクリックして、フロントエンドがバックエンドに複数のリクエストを繰り返し送信するのを防ぐためです。ここでは、よくある 2 つの実際的な状況を挙げます。
読み込みマスクがある場合でも上記の状況が発生する可能性があるため、フロントエンドで重複したリクエストを防ぐ方法を検討する必要があります。 コア - キャンセルトークンAxios でリクエストをキャンセルする中心的な方法は CanelToken です。公式ウェブサイトのドキュメントには、CancelTokenを使用する方法が2つ記載されています。ここでは、簡単な貼り付けとコメントの追加方法を紹介します。 方法1: CancelToken は axios.CancelToken に置き換えられます。 const ソース = CancelToken.source(); axios.get('/user/12345', { //リクエストにはCancelTokenを設定する必要があります cancelToken: source.token }).catch(関数(スロー) { // リクエストがキャンセルされた場合は、このメソッドに入り、(axios.isCancel(thrown)) かどうかを判断します。 console.log('リクエストがキャンセルされました', throwed.message); } それ以外 { // エラーを処理する } }); // 上記のリクエストをキャンセルします // source.cancel('messge') message はオプションであり、文字列である必要があります source.cancel('ユーザーによって操作がキャンセルされました。'); 方法2: CancelToken は axios.CancelToken に置き換えられます。 キャンセルする; axios.get('/user/12345', { // オプションで直接 cancelToken オブジェクトを作成します cancelToken: new CancelToken(function executor(c) { キャンセル = c; }) }); // 上記のリクエストをキャンセルします cancel(); 実用的なアプリケーションとパッケージング上記では axios のコアメソッドを例示しましたが、実際には公式ウェブサイトの例のようにこれらを使用することはほとんどありません。代わりに、axios インターセプターでグローバル構成管理を行います。この場合、上記のコードにいくつか変更を加える必要があります。 私が実装した一般的なアイデアは次のとおりです。
アイデアが完成したら、すぐにコードに取り掛かりましょう // 進行中のリクエストのリスト let reqList = [] /** * 重複リクエストを防止* @param {array} reqList - リクエストキャッシュリスト* @param {string} url - 現在のリクエストアドレス* @param {function} cancel - リクエスト中断関数* @param {string} errorMessage - リクエストが中断されたときに表示されるエラーメッセージ*/ const stopRepeatRequest = 関数 (reqList、url、cancel、errorMessage) { const errorMsg = エラーメッセージ || '' (i = 0 とします; i < reqList.length; i++) { if (reqList[i] === url) { キャンセル(エラーメッセージ) 戻る } } reqList.push(url) } /** * リクエストの続行を許可する * @param {array} reqList すべてのリクエストのリスト * @param {string} url リクエストアドレス */ const allowRequest = 関数 (reqList, url) { (i = 0 とします; i < reqList.length; i++) { if (reqList[i] === url) { 要求リスト.splice(i, 1) 壊す } } } const サービス = axios.create() // リクエストインターセプター service.interceptors.request.use( 設定 => { キャンセルする // cancelToken オブジェクトを設定する config.cancelToken = new axios.CancelToken(function(c) { キャンセル = c }) // 重複したリクエストを防ぎます。前のリクエストが完了していない場合、同じリクエストは停止されませんRepeatRequest(reqList, config.url, cancel, `${config.url} request is interrupted`) 設定を返す }, エラー => Promise.reject(エラー) ) // レスポンスインターセプター service.interceptors.response.use( レスポンス => { // 遅延を増やします。同じリクエストが短期間に繰り返し送信されないようにする必要があります。setTimeout(() => { allowRequest(reqList、response.config.url) は、 }, 1000) // ...リクエストが成功した後の後続の操作 // successHandler(response) }, エラー => { もし(axios.isCancel(スロー)){ console.log(スローされたメッセージ); } それ以外 { // 遅延を増やします。同じリクエストが短期間に繰り返し送信されないようにする必要があります。setTimeout(() => { allowRequest(reqList、error.config.url) は、 }, 1000) } // ...リクエストが失敗した後の後続の操作 // errorHandler(error) } ) いくつかの小さな詳細上記の方法 2 のコードを使用して cancelToken を設定しなかったのはなぜですか?
したがって、各リクエストの前に新しいオブジェクトを作成したくありません。各キャンセルが正しく実行されるようにするには、必ず方法 2 を使用してください。前のメソッドでは、キャンセルが発生した後も後続のリクエストは引き続きキャンセルされます。 なぜ応答に遅延を追加する必要があるのでしょうか? キャンセル時にメッセージだけでなくオブジェクトを渡すことはできますか? これで、axios でリクエストをキャンセルして重複リクエストを防ぐ方法についての記事は終了です。axios でリクエストをキャンセルして重複リクエストを防ぐ方法の詳細については、123WORDPRESS.COM の以前の記事を検索するか、次の関連記事を引き続き参照してください。今後とも 123WORDPRESS.COM をよろしくお願いいたします。 以下もご興味があるかもしれません:
|
<<: Zabbix で監視項目と集約されたグラフを設定するためのサンプルコード
>>: mysql update文の実行プロセスの詳細な説明
目次1. このキーワード2. カスタム属性3. 包括的なケース1:タブの実装付録要約する1. このキ...
次のような効果がよく見られます。 そうです、ページ上でよく使われる「展開と折りたたみ」のインタラクシ...
1. 原因:サブボックスをフロートに設定した後の効果: 青いボックスをフロートに設定すると、標準のド...
方法:説明: どちらも達成できません:方法1: sp_product から sp.productid...
従来の解決策FileReader を使用して UTF-8 形式のファイルを読み取り、ファイルの内容に...
エラー メッセージ:ストアの更新、挿入、または削除ステートメントが予期しない行数 (0) に影響を与...
目次1. 簡単な紹介2. スクリーンショットを実行する3. コードの紹介4. まとめ1. 簡単な紹介...
序文負荷分散には nginx を使用します。アーキテクチャのフロントエンドまたは中間層として、トラフ...
解決策は次のとおりです。 1. コンテナを強制削除する docker rm -f ジェンキンス2. ...
目次ミックスインの実装フック関数のマージプロジェクト実践伸ばす要約するVue は mixins AP...
この記事では、MySQLのプリコンパイル機能について紹介します。具体的な内容は以下のとおりです。 1...
この記事では、MySQL 8.0.24のインストールチュートリアルを参考までに紹介します。具体的な内...
目次1. データを準備するデータテーブルを作成するデータの挿入2. SQLドリル1. SQL文の強化...
2 つのテーブルを関連付けるときに、外部キーを作成できませんでした。このブログから、問題は、ポイント...
概要私は 1 年以上 Docker を使用しています。最近、サービスをすばやくオーケストレーションし...