序文実際のプロジェクトでは、リクエストに対して「手ぶれ防止」処理を実行する必要がある場合があります。これは主に、特定の状況下でユーザーが短時間にボタンを繰り返しクリックして、フロントエンドがバックエンドに複数のリクエストを繰り返し送信するのを防ぐためです。ここでは、よくある 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文の実行プロセスの詳細な説明
ムーアの法則はもはや適用されない2004年にフレックストロニクスがフロッグデザインを買収したのを皮切...
1. offsetParentの定義: offsetParentは子要素に最も近い位置に配置された親...
すりガラス効果がうまく表現されていれば、ページが非常に鮮やかで立体的に見えるようになります。写真に直...
問題の説明CSS を使用して上部の固定効果を実現したいと思います。 margin-top と pos...
最近、ウェブサイトを設計するときにこの問題に遭遇しています。メンバーセンターを設計し、コンテンツを ...
目次質問サーバー層とストレージエンジン層LIMITって何ですか?何をするか?トゥカオ最近、Q&...
エラー発生: MySQL 5.7 から SQL にデータベースをエクスポートし、それを MySQL ...
GROUP BY ステートメントは、Aggregate 関数と組み合わせて使用され、1 つ以上の...
背景色の点滅効果を実現するには、次のコードを <body> 領域に追加するだけです。コー...
この記事では主に、高さが不明な垂直方向の中央揃えを CSS で実装する方法を紹介し、皆さんと共有しま...
Vue コンポーネントは接続されているため、コンポーネント間で値を渡す必要があるのは避けられません...
XAML レイアウトを使用する場合、インターフェイスを Metro 風にするために、一部のボタンでは...
理由は簡単です。 HTML ドキュメントでは、複数の空白文字は 1 つの空白文字と同等です。つまり、...
関連記事: Web コンテンツ ページを作成するための 9 つの実用的なヒント<br />...
禅コーディングテキストエディタプラグインです。 Zen Coding を使用するテキスト エディター...