「労働者が自分の仕事をうまくやりたいなら、まず自分の道具を研ぎ澄まさなければなりません。」 - 孔子、「論語。陸霊公」
表紙 > プログラミング > フェッチリクエストが必要ないときにフェッチリクエストをキャンセルする簡単な方法

フェッチリクエストが必要ないときにフェッチリクエストをキャンセルする簡単な方法

2024 年 8 月 28 日に公開
ブラウズ:195

The Easy Way to Cancel Fetch Requests When You Don’t Need Them

このブログでは、AbortController API に焦点を当てながら、JavaScript を使用してフェッチ リクエストをキャンセルする実践的な手順を説明します。最後には、Web アプリの応答性を高め、リソースを使いやすくする方法を明確に理解できるようになります。

フェッチリクエストをキャンセルする必要があるのはなぜですか?

次のようなシナリオでは、フェッチ リクエストのキャンセルが重要です。

  • ユーザー エクスペリエンス: ユーザーがページから移動しても、そのページのデータを取得し続ける必要はありません。

  • 検索の最適化: キーストロークごとにリクエストがトリガーされる検索機能では、新しいリクエストを送信する前に前のリクエストをキャンセルする方が効率的です。

  • タイムアウトのシナリオ: ネットワークの遅延やリクエストの実行時間が長い場合は、タイムアウトを設定し、一定の期間を超えた場合にリクエストをキャンセルすることができます。

AbortController について

AbortController API は、フェッチ リクエストをキャンセルするエレガントな方法を提供します。これは、AbortController インスタンスを作成することで機能し、そのシグナルがフェッチ リクエストに渡されます。コントローラーで abort() メソッドを呼び出すと、リクエストがキャンセルされます。

フェッチリクエストをキャンセルするためのステップバイステップガイド

1. AbortController

を使用した基本セットアップ

最も基本的な例から始めましょう: AbortController の作成とフェッチ リクエストのキャンセルです。

// Step 1: Create an instance of AbortController
const controller = new AbortController();

// Step 2: Pass the signal to the fetch request
fetch('https://jsonplaceholder.typicode.com/posts', { signal: controller.signal })
    .then(response => response.json())
    .then(data => console.log('Data:', data))
    .catch(err => {
        if (err.name === 'AbortError') {
            console.log('Fetch request was canceled');
        } else {
            console.error('Fetch error:', err);
        }
    });

// Step 3: Cancel the fetch request
controller.abort();

2.実用的な使用例: ユーザー操作時のリクエストのキャンセル
一般的なシナリオの 1 つは、ユーザーの操作に応じてフェッチ リクエストをキャンセルすることです。たとえば、検索機能を実装する場合、キーストロークごとに新しいフェッチ リクエストがトリガーされる可能性があります。前のリクエストをキャンセルすると、古いデータや無関係なデータが処理されなくなります。

let controller;

function search(query) {
    // Cancel the previous request if it exists
    if (controller) {
        controller.abort();
    }

    // Create a new controller for the new request
    controller = new AbortController();

    // Fetch data with the new controller
    fetch(`https://jsonplaceholder.typicode.com/posts?query=${query}`, { signal: controller.signal })
        .then(response => response.json())
        .then(data => console.log('Search results:', data))
        .catch(err => {
            if (err.name === 'AbortError') {
                console.log('Previous request canceled');
            } else {
                console.error('Fetch error:', err);
            }
        });
}

// Example usage: simulate user typing
search('React');
search('Vue'); // The request for 'React' is canceled

3.フェッチリクエストのタイムアウトの実装
信頼性の低いネットワーク状態に対処する場合、タイムアウトは不可欠です。 AbortController を使用すると、時間がかかりすぎる場合にフェッチ リクエストをキャンセルするタイムアウト メカニズムを簡単に実装できます。

function fetchWithTimeout(url, timeout = 5000) {
    const controller = new AbortController();
    const timeoutId = setTimeout(() => controller.abort(), timeout);

    return fetch(url, { signal: controller.signal })
        .then(response => {
            clearTimeout(timeoutId);
            return response.json();
        })
        .catch(err => {
            if (err.name === 'AbortError') {
                console.log('Fetch request timed out');
            } else {
                console.error('Fetch error:', err);
            }
        });
}

// Example usage
fetchWithTimeout('https://jsonplaceholder.typicode.com/posts', 3000)
    .then(data => console.log('Data:', data));

フェッチリクエストのキャンセルを適切に処理する

フェッチリクエストをキャンセルするときは、それらを適切に処理することが重要です。これには、キャンセルによって引き起こされるエラーと他のタイプのエラーを区別することが含まれます。

fetch(url, { signal: controller.signal })
    .then(response => response.json())
    .then(data => console.log(data))
    .catch(err => {
        if (err.name === 'AbortError') {
            // Handle cancellation specifically
            console.log('Request was canceled');
        } else {
            // Handle other types of errors
            console.error('Request failed', err);
        }
    });

リリースステートメント この記事は次の場所に転載されています: https://dev.to/rigalpatel001/the-easy-way-to-cancel-fetch-requests-when-you-dont-need-them-1d3g?1 侵害がある場合は、 Study_golang@163 .comdelete に連絡してください
最新のチュートリアル もっと>

免責事項: 提供されるすべてのリソースの一部はインターネットからのものです。お客様の著作権またはその他の権利および利益の侵害がある場合は、詳細な理由を説明し、著作権または権利および利益の証拠を提出して、電子メール [email protected] に送信してください。 できるだけ早く対応させていただきます。

Copyright© 2022 湘ICP备2022001581号-3