jQuery Academy · レッスン

キャッシュとDeferredオブジェクトの活用

セレクターをキャッシュして重複するDOM検索を避け、jQuery Deferredオブジェクトで非同期処理をより効果的に管理し、コードの可読性とパフォーマンスを向上させます。

レッスン 3/311 ステップ

「キャッシュとDeferredオブジェクトの活用」はCoddyKit上の無料jQuery Academyレッスンです。 これはレッスン3/3です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはjQuery Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 jQuery Academyコースには全3レッスンが含まれています。

キャッシュとDeferredでパフォーマンスを向上

ようこそ。このレッスンでは、jQueryアプリケーションをより高速かつ効率的にする2つの強力なテクニック、セレクターのキャッシュとDeferredオブジェクトについて学びます。

これらの方法を使うと、重複した処理を減らし、複雑な非同期処理を簡単に管理できます。

セレクターのキャッシュが重要な理由

$("#myElement")や$(".item")のようなjQueryセレクターを使うたびに、jQueryは一致する要素を見つけるためにDocument Object Model(DOM)を走査する必要があります。

  • この走査は、複雑なセレクターや大規模なDOMツリーでは特に時間がかかることがあります。
  • 同じ要素を繰り返し検索すると、処理能力が無駄になります。

キャッシュを使えば、この無駄を避けられます。

選択結果を保存する

DOMを何度も検索する代わりに、jQueryによる選択結果を変数に保存します。この変数には、jQueryオブジェクトへの参照が保持されます。

次の例を実行して、選択結果をキャッシュする方法を確認してください。

// Imagine this is in your HTML
// <div id="myDiv">Hello</div>

// Simulate jQuery selecting an element
// In a real browser, this would return a jQuery object
const $myElement = {
  id: "myDiv",
  text: "Hello",
  // Simulate jQuery methods
  css: function(prop, value) {
    console.log(`Setting ${prop} to ${value} on #${this.id}`);
  },
  addClass: function(cls) {
    console.log(`Adding class "${cls}" to #${this.id}`);
  }
};

console.log("--- Without Caching (simulated) ---");
// This would ideally re-query the DOM
$myElement.css("color", "blue"); // Simulates $("#myDiv").css(...)
$myElement.addClass("highlight"); // Simulates $("#myDiv").addClass(...)

console.log("\n--- With Caching ---");
// We already have $myElement, so no re-query
$myElement.css("font-weight", "bold");
$myElement.addClass("active");

チェーンによる効率化

jQueryのメソッドチェーンは、同じ選択済み要素の集合を対象に処理するため、すでに効率化の一種です。

ただし、コード内の異なる箇所や複数のイベントハンドラーで同じ要素を操作する必要がある場合は、キャッシュが重要になります。

// Chaining is good for sequential ops
$("#myElement")
  .addClass("active")
  .css("color", "blue")
  .fadeIn();

// Caching is better for repeated, non-sequential ops
const $cachedElement = $("#myElement");
// Later in code...
$cachedElement.trigger("click");
// Even later...
$cachedElement.removeClass("active");

選択結果を再利用する

要素のグループを頻繁に操作する状況を考えてみましょう。最初の選択結果をキャッシュすれば、DOMへのクエリを繰り返さずに済みます。

これは、ループ内、イベントハンドラー内、または同じ要素の集合を操作する関数内で特に役立ちます。

// Imagine HTML: <li class="item">1</li> <li class="item">2</li>
// <li class="item">3</li> <button id="toggleBtn">Toggle</button>

// Simulate jQuery context
const $items = [{
  text: "Item 1"
}, {
  text: "Item 2"
}];
const $toggleButton = {
  text: "Toggle Button"
};

console.log("Cached items count:", $items.length);
console.log("Cached button text:", $toggleButton.text);

// Later, you might need them again, without re-querying
// e.g., in an event handler
function handleToggle() {
  // Use $items and $toggleButton directly
  console.log("Toggle button clicked! Working with cached items.");
}

// Call the function
handleToggle();

非同期処理を管理する

jQueryのDeferredオブジェクトを使うと、複数のコールバックをキューに登録したり、コールバックキューを呼び出したり、同期処理または非同期処理の成功・失敗状態を伝えたりできます。

  • 将来得られる結果に対する「promise」のようなものだと考えてください。
  • AJAXリクエスト、アニメーション、タイマーなどを扱うコードを整理するのに役立ちます。

新しいDeferredを作成する

$.Deferred()を使って新しいDeferredオブジェクトを作成できます。このオブジェクトには状態を制御するメソッドがあり、成功にはresolve()、失敗にはreject()を使います。

遅延後にresolveされる基本的なDeferredの設定方法を見てみましょう。

function doSomethingAsync() {
  const dfd = $.Deferred(); // Create a new Deferred

  setTimeout(function() {
    const success = Math.random() > 0.5; // Simulate success/failure
    if (success) {
      dfd.resolve("Operation successful!"); // Resolve on success
    } else {
      dfd.reject("Operation failed!"); // Reject on failure
    }
  }, 1000); // Simulate 1-second delay

  return dfd.promise(); // Return the Promise part
}

// This code will run when the scene loads
// We'll attach handlers in the next scene
console.log("Deferred created. Waiting for resolution...");

.done()と.fail()を使う

Deferredオブジェクト(またはそのpromise)を取得したら、成功時には.done()、エラー処理には.fail()を使ってコールバック関数を登録できます。

.always()コールバックは、成功・失敗にかかわらず実行されます。

function doSomethingAsync() {
  const dfd = $.Deferred();
  setTimeout(function() {
    const success = true; // For this example, let's ensure success
    if (success) {
      dfd.resolve("Data loaded!");
    } else {
      dfd.reject("Network error!");
    }
  }, 500);
  return dfd.promise();
}

const myPromise = doSomethingAsync();

myPromise.done(function(message) {
  console.log("SUCCESS:", message);
});

myPromise.fail(function(errorMessage) {
  console.log("FAILED:", errorMessage);
});

myPromise.always(function() {
  console.log("Operation complete (done or failed).");
});

console.log("Initiating async operation...");

.then()で結果を変換する

.done()と.fail()が最終的な処理に使われるのに対し、.then()はより柔軟です。解決された値を変換したり、新しいpromiseを返したりできるため、処理を順番に実行できます。

.then()を使って、結果を次の処理に渡す前に加工できます。

function fetchData() {
  const dfd = $.Deferred();
  setTimeout(() => {
    console.log("Data fetched.");
    dfd.resolve({
      id: 1,
      name: "Widget"
    });
  }, 500);
  return dfd.promise();
}

fetchData()
  .then(function(data) {
    console.log("Processing fetched data:", data);
    return data.name.toUpperCase(); // Transform the data
  })
  .then(function(processedName) {
    console.log("Transformed name:", processedName);
    // This second .then() receives the result of the first .then()
  })
  .fail(function(error) {
    console.error("Error:", error);
  });

console.log("Starting data fetch and transformation...");

キャッシュとDeferredのクイズ

簡単なチャレンジに挑戦してみませんか。セレクターのキャッシュとDeferredオブジェクトについての理解度を確認しましょう。

まとめ:より高速でスマートなjQuery

よくできました。jQueryアプリケーションのパフォーマンスとコード構成を大幅に改善する方法を学びました。

  • セレクターのキャッシュ:jQueryの選択結果を変数に保存し、コストのかかるDOM検索の繰り返しを避けます。
  • Deferredオブジェクト:$.Deferred()、.resolve()、.reject()、.done()、.fail()、.then()を使って、複雑な非同期処理を整理された効率的な方法で管理します。

これらのテクニックを活用して、より堅牢でパフォーマンスの高いWebアプリケーションを構築しましょう。

無料で開始

AI チューターと学ぶ JavaScript — 無料

ブラウザでリアルコードを書いて実行し、24/7 の AI チューターから瞬時にサポートを受け、ウェブまたはアプリで続きから学習できます。

コース
22
レッスン
48

よくある質問

「キャッシュとDeferredオブジェクトの活用」レッスンは無料ですか?

はい。「キャッシュとDeferredオブジェクトの活用」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、jQuery Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 jQuery Academyコースには全3レッスンが含まれています。

「キャッシュとDeferredオブジェクトの活用」で何を学びますか?

セレクターをキャッシュして重複するDOM検索を避け、jQuery Deferredオブジェクトで非同期処理をより効果的に管理し、コードの可読性とパフォーマンスを向上させます。 ブラウザで直接実行するハンズオンコードでjQuery Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。

jQuery Academyを始めるのに経験は必要ですか?

事前経験は必要ありません。CoddyKitのjQuery Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン3/3です。

「キャッシュとDeferredオブジェクトの活用」レッスンにはどのくらい時間がかかりますか?

ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。

このjQuery Academyレッスンでコードを書いて実行できますか?

はい。すべてのjQuery Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。

このコースのすべてのレッスン

  1. DOM操作の最適化
  2. 効率的なイベント処理とスロットリング
  3. キャッシュとDeferredオブジェクトの活用
← jQuery Academyに戻る