0Pricing
jQuery Academy · Урок

Использование кэширования и отложенных объектов

Используйте кэширование селекторов, чтобы избежать повторного поиска в DOM, и изучите отложенные объекты jQuery для более эффективного управления асинхронными операциями, повышения читаемости и производительности кода.

«Использование кэширования и отложенных объектов» — бесплатный урок jQuery Academy на CoddyKit. Это урок 3 из 3. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения jQuery Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс jQuery Academy содержит 3 уроков всего.

Повышаем производительность с помощью кэширования и Deferred

Добро пожаловать! В этом уроке мы рассмотрим два мощных метода, которые помогут сделать Ваши приложения на jQuery быстрее и эффективнее: кэширование селекторов и объекты Deferred.

Эти методы помогают сократить повторяющуюся работу и легко управлять сложными асинхронными операциями.

Почему важно кэшировать селекторы

Каждый раз, когда Вы используете селектор jQuery, например $("#myElement") или $(".item"), jQuery приходится обходить объектную модель документа (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();

Управление асинхронными операциями

Объект Deferred в jQuery позволяет регистрировать несколько функций обратного вызова в очередях, вызывать очереди обратных вызовов и передавать состояние успеха или сбоя любой синхронной или асинхронной операции.

  • Представьте его как «promise» для результата, который будет получен в будущем.
  • Он помогает организовать код, работающий с такими операциями, как запросы AJAX, анимации или таймеры.

Создание нового Deferred

Вы можете создать новый объект Deferred с помощью $.Deferred(). У этого объекта есть методы для управления его состоянием: resolve() — для успешного завершения и reject() — для сбоя.

Посмотрим, как настроить простой 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(), чтобы грамотно и эффективно управлять сложными асинхронными операциями.

Применяйте эти методы, чтобы создавать более надёжные и производительные веб-приложения!

Часто задаваемые вопросы

Урок «Использование кэширования и отложенных объектов» бесплатный?

Да — полный текст урока «Использование кэширования и отложенных объектов» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс jQuery Academy, подпишись на CoddyKit PRO. Курс jQuery Academy содержит 3 уроков всего.

Чему я научусь в уроке «Использование кэширования и отложенных объектов»?

Используйте кэширование селекторов, чтобы избежать повторного поиска в DOM, и изучите отложенные объекты jQuery для более эффективного управления асинхронными операциями, повышения читаемости и произ… Ты практикуешь jQuery Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.

Нужен ли мне опыт, чтобы начать jQuery Academy?

Предыдущий опыт не требуется. jQuery Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 3 из 3.

Сколько времени занимает урок «Использование кэширования и отложенных объектов»?

Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.

Можно ли писать и запускать код в этом уроке jQuery Academy?

Да. Каждый урок jQuery Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.

Все уроки этого курса

  1. Оптимизация операций с DOM
  2. Эффективная обработка событий и регулирование частоты
  3. Использование кэширования и отложенных объектов
← Назад к jQuery Academy