📘 Урок 13: jQuery Deferred и Promises — работа с асинхронностью
- 🔹 Что такое Deferred и Promises
- 🔸 Deferred — объект управления асинхронной операцией
- 🔸 Promise — часть Deferred, с которой работает код
- 🔸 Пример создания Deferred вручную
- 🔸 Использование Deferred с Ajax
- 🔸 Цепочки и комбинации Deferred
- 🔸 Практические задачи с Deferred
- 🔸 Обработка ошибок
- 📋 Задания для практики
- ❗ Частые ошибки
- ❌ Забыт вызов .promise() при возврате Deferred
- ❌ Ошибка понимания, что .then() — это и .done(), и .fail()
- 📌 Заключение
Цель: разобраться, что такое Deferred и Promises в jQuery, и как с их помощью удобно работать с асинхронными операциями — Ajax, таймерами и другими.
🔹 Что такое Deferred и Promises?
Когда выполняется асинхронная операция (например, Ajax-запрос), результат приходит не сразу. Чтобы удобно управлять такими операциями, используются объекты Deferred и Promise — они позволяют регистрировать функции обратного вызова (callbacks), которые сработают при успехе, ошибке или завершении операции.
🔸 Deferred — объект управления асинхронной операцией
Deferred позволяет:
-
Зарегистрировать обработчики
.done()
,.fail()
,.always()
-
Принудительно разрешить (
resolve()
) или отклонить (reject()
) операцию -
Создать цепочки вызовов
🔸 Promise — часть Deferred, с которой работает код
Promise — это объект, через который вы подписываетесь на события: когда задача выполнена или провалилась.
🔸 Пример создания Deferred вручную
function asyncTask() {
let d = $.Deferred();
setTimeout(function() {
if (Math.random() > 0.5) {
d.resolve('Успех!');
} else {
d.reject('Ошибка!');
}
}, 1000);
return d.promise();
}
asyncTask()
.done(function(msg) { console.log('Done: ' + msg); })
.fail(function(msg) { console.log('Fail: ' + msg); })
.always(function() { console.log('Задача завершена'); });
🔸 Использование Deferred с Ajax
jQuery Ajax-методы возвращают Promise:
$.get('/data.json')
.done(function(data) {
console.log('Данные получены', data);
})
.fail(function() {
console.log('Ошибка загрузки');
})
.always(function() {
console.log('Запрос завершён');
});
🔸 Цепочки и комбинации Deferred
-
.then(success, fail)
— для обработки результата и ошибки -
$.when()
— ждать несколько Deferred одновременно
let d1 = $.Deferred();
let d2 = $.Deferred();
$.when(d1, d2).done(function(r1, r2) {
console.log('Обе задачи завершены', r1, r2);
});
setTimeout(() => d1.resolve('Первый'), 1000);
setTimeout(() => d2.resolve('Второй'), 1500);
🔸 Практические задачи с Deferred
-
Асинхронная загрузка нескольких файлов
-
Последовательное выполнение Ajax-запросов
-
Отложенное выполнение кода
🔸 Обработка ошибок
fail()
позволяет ловить ошибки. Можно регистрировать несколько обработчиков.
📋 Задания для практики
-
Создай функцию с Deferred, которая через 2 секунды «решает» результат.
-
Сделай Ajax-запрос с обработкой
.done()
,.fail()
,.always()
. -
Используй
$.when()
для параллельных запросов и вывода результата после всех. -
Напиши цепочку
.then()
с разными обработчиками. -
Попробуй вручную отклонять Deferred и смотреть обработку ошибок.
❗ Частые ошибки
❌ Забыт вызов .promise()
при возврате Deferred
Нужно возвращать d.promise()
, чтобы скрыть методы resolve()
и reject()
.
❌ Ошибка понимания, что .then()
— это и .done()
, и .fail()
.then()
принимает два колбэка: первый — успех, второй — ошибка.
📌 Заключение
Deferred и Promises — важный инструмент для управления асинхронностью в jQuery. Они делают код чистым, понятным и легко масштабируемым.