「労働者が自分の仕事をうまくやりたいなら、まず自分の道具を研ぎ澄まさなければなりません。」 - 孔子、「論語。陸霊公」
表紙 > プログラミング > JavaScript におけるデバウンスとスロットリング: いつ、そしてなぜ使用すべきか

JavaScript におけるデバウンスとスロットリング: いつ、そしてなぜ使用すべきか

2024 年 11 月 2 日に公開
ブラウズ:606

Debouncing vs Throttling in JavaScript: When and Why You Should Use Them

JavaScript は、Web アプリを動的かつインタラクティブにするのに優れていますが、単独ではうまく処理できないことが 1 つあります。それは、頻繁なイベントです。ウィンドウのサイズ変更、スクロール、検索ボックスへの入力などについて考えてみましょう。適切に管理しないと、これらがアプリにイベント トリガーを大量に送り込み、動作が遅くなり、ユーザー エクスペリエンスが遅くなる可能性があります。そこで、デバウンシングスロットルの出番です。これらのテクニックは、特定の関数が実行される頻度を制御し、アプリの高速性と応答性を維持するのに役立ちます。

この記事では、デバウンシングスロットリングについて詳しく説明し、いつそれらを使用するかを示し、実際の例を示してそれらの動作を確認します。これらの重要な JavaScript パフォーマンス最適化テクニックについて詳しく見ていきましょう!

デバウンスとは何ですか?

仕組み

デバウンスとは、相手が話し終わるのを待ってから返信を始めるようなものだと考えてください。誰かがあなたの話を中断し続ける会話に参加したことがあるなら、アイデアがわかるでしょう。 デバウンシング の重要な概念は、最後にイベントがトリガーされてから指定された時間が経過するまで関数の実行を遅らせることです。

簡単に言えば、イベント (ユーザーの入力など) が急速に発生し続ける場合、デバウンスにより、ユーザーが一定期間停止した後にのみ関連する機能 (検索クエリなど) が実行されるようになります。

デバウンスを使用する場合

頻繁なユーザー入力によって引き起こされる過度の関数呼び出しを制限したい場合は、デバウンスを使用する必要があります。典型的な例は、検索ボックスがあり、ユーザーが入力するたびに API 呼び出しを行う場合です。デバウンスを行わないと、キーストロークごとに API が呼び出され、サーバーに不要な負荷がかかる可能性があります。デバウンスを使用すると、ユーザーが入力をやめたときにのみ API が呼び出されます。

コードでのデバウンス

function debounce(func, delay) {
    let timeoutId;
    return function(...args) {
        clearTimeout(timeoutId);
        timeoutId = setTimeout(() => func.apply(this, args), delay);
    };
}

// Usage
const searchInput = document.getElementById('search');
searchInput.addEventListener('input', debounce(() => {
    console.log('API call made!');
}, 300)); // Only executes 300ms after the last keystroke

この例では、デバウンス関数により、ユーザーが入力を停止してから 300 ミリ秒後にのみ API 呼び出しが行われるようにしています。

スロットリングとは何ですか?

デバウンスとの違い

それでは、スロットルについて話しましょう。 debounceing がおしゃべりが消えるまで応答を待機している場合、throttleling は、待機している車の数に関係なく、数秒ごとに 1 台の車しか通過させない交通警官のようなものです。これにより、イベントが繰り返しトリガーされた場合でも、関数は設定された期間ごとに最大 1 回呼び出されることが保証されます。

スロットリングを使用する場合

時間の経過とともに一貫した実行を保証する必要がある場合は、スロットルを使用するとよいでしょう。たとえば、ユーザーがページを下にスクロールすると、スクロール イベントが 1 秒あたり数十回トリガーされることがあります。スロットリングを行わないと、アプリがこれらすべてのイベントを処理しようとするため、速度が低下する可能性があります。スロットルにより、スクロール イベント ハンドラーの実行頻度が制限され、パフォーマンスが向上します。

コードでのスロットリング

関数スロットル(関数、制限) { lastCall = 0 にします。 return function(...args) { const now = Date.now(); if (現在 - lastCall >= 制限) { lastCall = 今; func.apply(this, args); } }; } // 使用法 window.addEventListener('scroll', throttle(() => { console.log('スクロールイベント!'); }, 1000)); // 最大 1000 ミリ秒ごとに実行されます
function throttle(func, limit) {
    let lastCall = 0;
    return function(...args) {
        const now = Date.now();
        if (now - lastCall >= limit) {
            lastCall = now;
            func.apply(this, args);
        }
    };
}

// Usage
window.addEventListener('scroll', throttle(() => {
    console.log('Scroll event!');
}, 1000)); // Executes at most once every 1000ms

ここでは、スロットル関数により、スクロール イベント ハンドラーが 1000 ミリ秒ごとに 1 回のみ実行されるようにし、アプリが過負荷にならないようにします。

実際の例

これらのテクニックをより実践的な文脈に落とし込んでみましょう。ユーザーが検索ボックスに入力する

React アプリ を構築しているとします。入力イベントをデバウンスして、サーバーに API 呼び出しが殺到するのを防ぐことができます。あるいは、ユーザーがページをどこまでスクロールしたかを追跡している場合は、スロットリングを使用してパフォーマンスを最適化できます。

React でのデバウンス

import { useState } から 'react'; 関数 SearchComponent() { const [クエリ、setQuery] = useState(''); const handleSearch = debounce((値) => { // 値を指定した API 呼び出し console.log('検索中:', 値); }, 300); 戻る ( { setQuery(e.target.value); handleSearch(e.target.value); }} /> ); }
function throttle(func, limit) {
    let lastCall = 0;
    return function(...args) {
        const now = Date.now();
        if (now - lastCall >= limit) {
            lastCall = now;
            func.apply(this, args);
        }
    };
}

// Usage
window.addEventListener('scroll', throttle(() => {
    console.log('Scroll event!');
}, 1000)); // Executes at most once every 1000ms

スクロールイベントの調整

import { useEffect } から 'react'; 関数 ScrollTracker() { useEffect(() => { const handleScroll = throttle(() => { console.log('スクロール中...'); }, 1000); window.addEventListener('scroll', handleScroll); return () => window.removeEventListener('scroll', handleScroll); }、[]); return
スクロールしてスロットリングの動作を確認してください。
; }
function throttle(func, limit) {
    let lastCall = 0;
    return function(...args) {
        const now = Date.now();
        if (now - lastCall >= limit) {
            lastCall = now;
            func.apply(this, args);
        }
    };
}

// Usage
window.addEventListener('scroll', throttle(() => {
    console.log('Scroll event!');
}, 1000)); // Executes at most once every 1000ms

パフォーマンス最適化のベストプラクティス

デバウンスとスロットリング: いつ選択するか

これが簡単な経験則です:

    デバウンスは、ユーザーが何かをするのをやめるまで待ちたい場合に最適です。たとえば、検索バーに「
  • 」と入力する場合です。
  • スロットリングは、長期間にわたって一貫した定期的な実行を確保したい場合に最適に機能します。ウィンドウのスクロールやサイズ変更に最適です。
どのような種類のイベントを扱っているか、そしてそれがどれくらいの頻度でトリガーされるのかがわかれば、その仕事に適した手法を選択できます。

結論

JavaScript での頻繁なイベントの制御はパフォーマンスの最適化に不可欠であり、

デバウンススロットルの両方が強力なソリューションを提供します。それぞれをいつ使用するかを理解することで、検索入力の処理、ウィンドウのサイズ変更、スクロール イベントの管理など、Web アプリケーションをよりスムーズで応答性の高いものにすることができます。

次に、アプリがあまりにも多くのイベントによって行き詰まっていることに気付いたら、次のように自問してください:

デバウンスする必要があるのか​​、それともスロットルするべきでしょうか?きっと喜んでいただけるはずです!

試してみる準備はできましたか? 次回プロジェクトに取り組むときに、これらのテクニックを試してみてください。すべてがどれほどスムーズになったかに驚くでしょう!

リリースステートメント この記事は次の場所に転載されています: https://dev.to/paharihacker/debouncing-vs-throttling-in-javascript-when-and-why-you-Should-use-them-1l09?1 侵害がある場合は、 Study_golang@163 .comdelete に連絡してください
最新のチュートリアル もっと>
  • Git LFS を使用して大きなファイルを Git リポジトリにプッシュする方法
    Git LFS を使用して大きなファイルを Git リポジトリにプッシュする方法
    最近、高解像度のアセットを扱う必要があるプロジェクトに取り組んでいましたが、その結果、サイズが大きくなってしまいました。ファイルをリポジトリにプッシュできませんでした。試行すると必ず次のエラーが表示されました: リモート: エラー: ファイル file.csv は 182.47 MB​​ です。これ...
    プログラミング 2024 年 11 月 2 日に公開
  • return ステートメントの配置は For ループの機能にどのような影響を与えますか?
    return ステートメントの配置は For ループの機能にどのような影響を与えますか?
    For ループ内の Return ステートメントの配置この特定のケースでは、make_list 関数内に return ステートメントを配置すると、プログラムの意図した機能が妨げられます。 。 return ステートメントは、for ループ内ではなく、関数の最後に配置する必要があります。for ルー...
    プログラミング 2024 年 11 月 2 日に公開
  • もうプレプテンバーですか?
    もうプレプテンバーですか?
    皆さんおはようございます、MonDEV おめでとうございます ☕ 私たちは本格的に戻ってきており、9 月に PC に戻るのが良い理由の 1 つはプレプテンバーです! 初期の頃からニュースレターをフォローしている人や、オープンソースの世界をフォローしている人はすでに知っていると思いますが、10 月には...
    プログラミング 2024 年 11 月 2 日に公開
  • 間違って配置された return ステートメントが for ループ内でプログラムの早期終了を引き起こすのはなぜですか?
    間違って配置された return ステートメントが for ループ内でプログラムの早期終了を引き起こすのはなぜですか?
    for ループの Return ステートメントが間違っているこのプログラミングの問題では、ユーザーは 3 匹の動物に対するユーザー入力を可能にするプログラムを作成する際に困難に遭遇します。 。このプログラムは、名前、動物の種類、年齢を含むペット オブジェクトをリストに追加するように設計されています。...
    プログラミング 2024 年 11 月 2 日に公開
  • 項目 他の型の方が適している場合は文字列を避ける
    項目 他の型の方が適している場合は文字列を避ける
    1.他のデータ型の代わりに文字列を使用することは避けてください: 文字列はテキストを表すように設計されていますが、数値、列挙型、または集合構造を表すために誤用されることがよくあります。 データが本質的に数値である場合は、String. ではなく、int、float、BigInteger などの型を...
    プログラミング 2024 年 11 月 2 日に公開
  • sync.WaitGroup を使用して Go 同時実行でデッドロックを防ぐ方法
    sync.WaitGroup を使用して Go 同時実行でデッドロックを防ぐ方法
    ゴルーチンのデッドロックの解決このシナリオでは、Go 同時実行コードでデッドロック エラーが発生しました。問題を詳しく調べて、効率的な解決策を提供しましょう。このエラーは、プロデューサとコンシューマの動作の不一致が原因で発生します。プロデューサー関数に実装されたプロデューサーは、限られた期間、チャネ...
    プログラミング 2024 年 11 月 2 日に公開
  • テキスト ファイル内の Unicode テキストを処理する方法: エラーのない書き込みのための完全ガイド
    テキスト ファイル内の Unicode テキストを処理する方法: エラーのない書き込みのための完全ガイド
    テキスト ファイル内の Unicode テキスト: エラーのない記述のための包括的なガイドGoogle ドキュメントから抽出されたデータのコーディングは、特に困難な場合があります。 HTML で使用するために変換する必要がある非 ASCII シンボルが見つかった場合。このガイドでは、Unicode ...
    プログラミング 2024 年 11 月 2 日に公開
  • EchoAPI と不眠症: 実践例による包括的な比較
    EchoAPI と不眠症: 実践例による包括的な比較
    フルスタック開発者として、私は API のデバッグ、テスト、文書化のための一流のツールを用意することがいかに重要であるかを知っています。 EchoAPI と Insomnia は 2 つの傑出したオプションであり、それぞれに独自の特徴と機能があります。これらのツールについて説明し、その機能と利点を比...
    プログラミング 2024 年 11 月 2 日に公開
  • 移動時間と所要時間 |プログラミングチュートリアル
    移動時間と所要時間 |プログラミングチュートリアル
    導入 このラボは、Go の時間と期間のサポートについての理解をテストすることを目的としています。 時間 以下のコードには、Go で時間と期間を操作する方法の例が含まれています。ただし、コードの一部が欠落しています。あなたの仕事は、コードを完成させて期待通りに動作させ...
    プログラミング 2024 年 11 月 2 日に公開
  • ホイスティングにおける面接の質問と回答
    ホイスティングにおける面接の質問と回答
    1. JavaScript におけるホイスティングとは何ですか? 答え: ホイスティングは、変数や関数にメモリが割り当てられる実行コンテキストの作成フェーズ中のプロセスです。このプロセス中に、変数用のメモリが割り当てられ、変数には未定義の値が割り当てられます。関数の場合、関数定義全...
    プログラミング 2024 年 11 月 2 日に公開
  • JavaScript のドキュメント オブジェクト モデル (DOM) を理解する
    JavaScript のドキュメント オブジェクト モデル (DOM) を理解する
    こんにちは、素晴らしい JavaScript 開発者の皆さん? ブラウザは、スクリプト (特に JavaScript) が Web ページのレイアウトと対話できるようにするドキュメント オブジェクト モデル (DOM) と呼ばれるプログラミング インターフェイスを提供します。 We...
    プログラミング 2024 年 11 月 2 日に公開
  • SPRING BATCH でプログラミングを始める
    SPRING BATCH でプログラミングを始める
    Introduction Dans vos projets personnels ou professionnels, Il vous arrive de faire des traitements sur de gros volumes de données. Le traite...
    プログラミング 2024 年 11 月 2 日に公開
  • CSS で Github プロフィールを目立たせる
    CSS で Github プロフィールを目立たせる
    これまで、Github プロフィールをカスタマイズできる唯一の方法は、写真を更新するか名前を変更することでした。これは、すべての Github プロファイルが同じに見え、カスタマイズしたり目立たせるためのオプションが最小限であることを意味しました。 それ以来、Markdown を使用してカスタム セ...
    プログラミング 2024 年 11 月 2 日に公開
  • TypeScript ユーティリティの種類: コードの再利用性の向上
    TypeScript ユーティリティの種類: コードの再利用性の向上
    TypeScript は、開発者が型を効果的に変換および再利用できるようにする組み込みのユーティリティ型を提供し、コードをより柔軟で ​​DRY にします。この記事では、TypeScript スキルを次のレベルに引き上げるのに役立つ、Partial、Pick、Omit、Record などの主要なユー...
    プログラミング 2024 年 11 月 2 日に公開
  • 電報 window.open(url, &#_blank&#); iOSでは動作がおかしい
    電報 window.open(url, &#_blank&#); iOSでは動作がおかしい
    電報ボットを作成していて、ミニアプリからチャットに情報を転送するオプションを追加したいと考えています。 window.open(url, '_blank'); を使用することにしました。 iPhone で試してみるまでは問題なく動作していました。転送の代わりに、Share を取得しま...
    プログラミング 2024 年 11 月 2 日に公開

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

Copyright© 2022 湘ICP备2022001581号-3