ホームページ > ウェブフロントエンド > jsチュートリアル > Promise.race を使用して呼び出しをフェッチするタイムアウトを追加する方法

Promise.race を使用して呼び出しをフェッチするタイムアウトを追加する方法

Mary-Kate Olsen
リリース: 2024-12-01 18:18:11
オリジナル
277 人が閲覧しました

How to use Promise.race to add timeout to fetch calls

フェッチ API はネットワーク リクエストを行うのに非常に便利ですが、タイムアウト機能は組み込まれていません。これは、ネットワークが遅い場合、またはサーバーが応答しない場合、アプリが無期限にハングする可能性があることを意味します。

幸いなことに、JavaScript はイベント駆動型プログラミングを中心とした多用途言語であり、Promise オブジェクトにグループ化された一連のユーティリティ関数を提供します。 Promise.race メソッドを使用すると、フェッチ呼び出しのタイムアウト メカニズムを作成できます。こうすることで、ネットワークが計画どおりに進まない場合でも、アプリケーションの応答性を維持できます。

それでは、Promise.race を使用してこのタイムアウトを実装する方法を説明します。簡単なフェッチの例から始めて、タイムアウトを追加して拡張します。また、CSRF トークンを扱う実際のシナリオを共有して、このメソッドが安全なコンテキストでどのように機能するかを示します。

これがあると仮定しましょう:

// Prepare fetch options
const options = {
    method: method,
    headers: {
        'Content-Type': 'application/json',
        'Accept': 'application/json',
        'X-CSRF-TOKEN': csrfToken
    },
    body: JSON.stringify({items})
};

// Make the fetch request
const response = await fetch(fetchUrl, options);
ログイン後にコピー

取得するタイムアウトメカニズムを追加したい場合は、拒否をトリガーするタイムアウトを備えた Promise を作成できます。 Promise は Promise.race を使用して複数の Promise を実行し、1 つが拒否または解決で終了すると、残りのすべてを停止します。

// Timeout mechanism for fetch
const fetchWithTimeout = (url, options, timeout = 5000) => {
    return Promise.race([
        fetch(url, options),
        new Promise((_, reject) => setTimeout(() => reject(new Error('Request timed out')), timeout))
    ]);
};

// Make the fetch request
const response = await fetchWithTimeout(fetchUrl, options);
ログイン後にコピー

これは CSRF トークンを使用した実際の例です

// Validate CSRF token
const csrfToken = document.querySelector('meta[name="csrf-token"]')?.content;
if (!csrfToken) {
    throw new Error('CSRF token not found in the document.');
}

// Prepare fetch options
const options = {
    method: method,
    headers: {
        'Content-Type': 'application/json',
        'Accept': 'application/json',
        'X-CSRF-TOKEN': csrfToken
    },
    body: JSON.stringify({items})
};

// Timeout mechanism for fetch
const fetchWithTimeout = (url, options, timeout = 5000) => {
    return Promise.race([
        fetch(url, options),
        new Promise((_, reject) => setTimeout(() => reject(new Error('Request timed out')), timeout))
    ]);
};

// Make the fetch request
const response = await fetchWithTimeout(fetchUrl, options);
ログイン後にコピー

以上がPromise.race を使用して呼び出しをフェッチするタイムアウトを追加する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:dev.to
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート