jQuery Academy · Lekcja

Wykorzystanie buforowania i obiektów Deferred

Proszę korzystać z buforowania selektorów, aby unikać zbędnego wyszukiwania w DOM, oraz poznać obiekty Deferred jQuery do skuteczniejszego zarządzania operacjami asynchronicznymi i poprawy czytelności oraz wydajności kodu.

Lekcja 3 z 311 kroki

Wykorzystanie buforowania i obiektów Deferred to bezpłatna lekcja jQuery Academy na CoddyKit. To lekcja 3 z 3. Możesz przeczytać całą lekcję poniżej za darmo — a potem ćwiczyć ją interaktywnie w przeglądarce z wbudowanym edytorem kodu i tutorem AI dostępnym 24/7. To część ścieżki edukacyjnej jQuery Academy, a Twój postęp synchronizuje się między webem a aplikacją CoddyKit. Kurs jQuery Academy zawiera 3 lekcji w sumie.

Zwiększ wydajność dzięki cachingowi i Deferreds

Witaj! W tej lekcji poznasz dwie skuteczne techniki, które sprawią, że Twoje aplikacje jQuery będą szybsze i wydajniejsze: caching selektorów oraz obiekty Deferred.

Metody te pomagają ograniczyć zbędną pracę i łatwo zarządzać złożonymi operacjami asynchronicznymi.

Dlaczego caching selektorów ma znaczenie

Za każdym razem, gdy używasz selektora jQuery, takiego jak $("#myElement") lub $(".item"), jQuery musi przeszukać Document Object Model (DOM), aby znaleźć pasujące elementy.

  • Takie przeszukiwanie może być powolne, zwłaszcza w przypadku złożonych selektorów lub dużych drzew DOM.
  • Wielokrotne wyszukiwanie tych samych elementów niepotrzebnie zużywa moc obliczeniową.

Caching pomaga tego uniknąć!

Przechowywanie wyników selekcji

Zamiast wielokrotnie przeszukiwać DOM, zapisz wynik selekcji jQuery w zmiennej. Zmienna ta będzie przechowywać odwołanie do obiektu jQuery.

Uruchom ten przykład, aby zobaczyć, jak buforujemy wynik selekcji:

// 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");

Łączenie metod dla większej wydajności

Łączenie metod w jQuery samo w sobie jest formą optymalizacji, ponieważ operacje są wykonywane na tym samym wybranym zbiorze elementów.

Jednak caching ma kluczowe znaczenie, gdy trzeba wykonywać operacje na tych samych elementach w różnych miejscach kodu lub w różnych handlerach zdarzeń.

// 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");

Ponowne używanie wyników selekcji

Rozważ sytuację, w której często korzystasz z grupy elementów. Zbuforowanie początkowej selekcji zapobiega wielokrotnemu przeszukiwaniu DOM.

Jest to szczególnie przydatne wewnątrz pętli, handlerów zdarzeń lub funkcji działających na tym samym zbiorze elementów.

// 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();

Zarządzanie operacjami asynchronicznymi

Obiekt Deferred w jQuery umożliwia rejestrowanie wielu callbacków w kolejkach, wywoływanie kolejek callbacków oraz przekazywanie informacji o powodzeniu lub niepowodzeniu dowolnej operacji synchronicznej bądź asynchronicznej.

  • Możesz myśleć o nim jak o „obietnicy” przyszłego wyniku.
  • Pomaga porządkować kod obsługujący takie operacje jak żądania AJAX, animacje czy liczniki czasu.

Tworzenie obiektu Deferred

Nowy obiekt Deferred możesz utworzyć za pomocą $.Deferred(). Obiekt ten ma metody do kontrolowania swojego stanu: resolve() w przypadku powodzenia oraz reject() w przypadku niepowodzenia.

Sprawdźmy, jak skonfigurować podstawowy obiekt deferred, który zostanie rozstrzygnięty po upływie określonego czasu.

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...");

Używanie .done() i .fail()

Gdy masz już obiekt Deferred lub jego promise, możesz dołączyć funkcje callback za pomocą .done() w przypadku powodzenia oraz .fail() do obsługi błędów.

Callback .always() jest wykonywany niezależnie od powodzenia lub niepowodzenia.

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...");

Przekształcanie wyników za pomocą .then()

Podczas gdy .done() i .fail() służą do końcowej obsługi, .then() jest bardziej wszechstronne. Może przekształcać rozstrzygniętą wartość lub zwracać nowy promise, umożliwiając sekwencyjne przetwarzanie.

Możesz użyć .then(), aby przetworzyć wynik przed przekazaniem go dalej.

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...");

Quiz: caching i Deferreds

Gotowy(-a) na krótkie wyzwanie? Sprawdź swoją wiedzę na temat cachingu selektorów i obiektów Deferred.

Podsumowanie: szybsze i inteligentniejsze jQuery

Świetnie! Dowiedziałeś(-aś) się, jak znacznie poprawić wydajność aplikacji jQuery i uporządkować jej kod:

  • Caching selektorów: Przechowuj wyniki selekcji jQuery w zmiennych, aby uniknąć kosztownego, wielokrotnego przeszukiwania DOM.
  • Obiekty Deferred: Używaj $.Deferred(), .resolve(), .reject(), .done(), .fail() i .then(), aby przejrzyście i wydajnie zarządzać złożonymi operacjami asynchronicznymi.

Stosuj te techniki, aby tworzyć bardziej niezawodne i wydajne aplikacje internetowe!

Bezpłatny start

Ucz się JavaScript dzięki korepetycjom AI — za darmo

Pisz i uruchamiaj kod w przeglądarce, otrzymuj natychmiastową pomoc od korepetytora AI dostępnego 24/7 i kontynuuj naukę w sieci lub w aplikacji.

Kursy
22
Lekcje
48

Często zadawane pytania

Czy lekcja „Wykorzystanie buforowania i obiektów Deferred” jest bezpłatna?

Tak — pełny tekst „Wykorzystanie buforowania i obiektów Deferred” jest dostępny za darmo tutaj w sieci. Aby ćwiczyć ją interaktywnie (wbudowany edytor kodu i tutor AI dostępny 24/7) i odblokować resztę kursu jQuery Academy, przejdź na CoddyKit PRO. Kurs jQuery Academy zawiera 3 lekcji w sumie.

Co nauczysz się w „Wykorzystanie buforowania i obiektów Deferred”?

Proszę korzystać z buforowania selektorów, aby unikać zbędnego wyszukiwania w DOM, oraz poznać obiekty Deferred jQuery do skuteczniejszego zarządzania operacjami asynchronicznymi i poprawy czytelnośc… Ćwiczysz jQuery Academy z praktycznym kodem, który uruchamiasz bezpośrednio w przeglądarce, a tutor AI dostępny 24/7 odpowiada na Twoje pytania podczas pracy nad lekcją.

Czy potrzebuję doświadczenia, aby zacząć jQuery Academy?

Nie wymagamy żadnego doświadczenia. jQuery Academy w CoddyKit jest strukturyzowany dla początkujących i zaawansowanych użytkowników, więc możesz zacząć tutaj lub od początku i uczyć się w swoim tempie. To lekcja 3 z 3.

Ile czasu zajmuje lekcja „Wykorzystanie buforowania i obiektów Deferred”?

Większość lekcji CoddyKit trwa około 5–10 minut. Każda lekcja to mały, interaktywny krok, dzięki czemu robisz systematyczne postępy i zawsze wracasz dokładnie do tego samego miejsca — na webie i w aplikacji.

Czy mogę pisać i uruchamiać kod w tej lekcji jQuery Academy?

Tak. Każda lekcja jQuery Academy zawiera wbudowany edytor kodu, więc piszesz i uruchamiasz prawdziwy kod bezpośrednio w przeglądarce i od razu otrzymujesz sprzężenie zwrotne od AI — bez konfiguracji na komputerze.

Wszystkie lekcje w tym kursie

  1. Optymalizacja operacji na DOM
  2. Efektywna obsługa zdarzeń i throttling
  3. Wykorzystanie buforowania i obiektów Deferred
← Powrót do jQuery Academy