序文実際のプロジェクトでは、リクエストに対して「手ぶれ防止」処理を実行する必要がある場合があります。これは主に、特定の状況下でユーザーが短時間にボタンを繰り返しクリックして、フロントエンドがバックエンドに複数のリクエストを繰り返し送信するのを防ぐためです。ここでは、よくある 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文の実行プロセスの詳細な説明
世界的に有名な仮想マシン ソフトウェア VMware-workstation-full-15.5.0...
最初に書くこの記事では、ELK 7.3.0 の展開についてのみ説明します。展開環境:システムセントO...
sudo 設定ファイルsudo のデフォルトの設定ファイルは /etc/sudoers です。一般的...
序文:タイムスタンプ フィールドは、MySQL でよく使用されます。たとえば、データ行が作成または変...
1. 依存パッケージをインストールする [root@localhost ~]# yum insta...
目次使用されるPygame関数スクリーンの作成ヘビの作成ヘビを動かすゲームオーバーの処理食事を増やす...
MySQL は最もよく使用されるデータベースです。詳しく知るには、コンピュータにインストールする必...
MySQL ストアド プロシージャ パラメータには、in、out、inout の 3 種類があります...
国内の多くの広告主にとって、印刷広告の制作と評価は、しばしばかなり主観的です。自分の感情や美的感覚に...
序文インデックスの選択はオプティマイザ段階の作業であることはわかっていますが、オプティマイザは万能で...
vue-routerには2つのモードがありますハッシュモード履歴モード1. シングルページアプリケー...
目次Dockerを使用してMySQLサービスをデプロイする方法DockerでRedisサービスをデプ...
目次1. 再帰とは何ですか? 2. 再帰を使って数学の問題を解く1. 1 * 2 * 3 * 4 …...
この記事では、ウェブ計算機のマインスイーパゲームを実装するためのJavaScriptの具体的なコード...
目次IN が遅いのはなぜですか? INとEXISTSのどちらが速いでしょうか?効率を向上させるにはど...