Заместитель deferred
Создает заместителя deferred-объекта (объект с аналогичным набором методов, за исключением отсутствия методов изменения состояния объекта. Предоставление заместителя вместо исходного объекта, гарантирует, что его состояние нельзя будет изменить из вне). Замечание: данный метод, относится к методам объекта deferred, а не jQuery. У последнего есть метод с таким же названием, однако его назначение немного отличается.
Создает заместителя deferred-объекта. Вместо создания нового объекта заместителя, можно наделить любой существующий объект всеми его свойствами и методами. Для этого нужно указать этот объект в параметре target. В результате, promise() вернет указанный объект, который будет обладать как первоначальными методами и полями, так и методами и полями заместителя (см. Пример 2).
В действии
Пример 1
Реализуем функцию test, которая запустит некую функцию someAction в течении 10 секунд. Допустим, что нам необходимо отслеживать выполнение someAction, для этого, состояние ее выполнение мы будем хранить в объекте deffered. Чтобы состояние нельзя было изменить извне, test будет возвращать не сам deffered, а его заместителя:
function test(){ var d = $.Deferred(); var actTime = 10000*Math.random(); // время запуска 0-10 сек setTimeout(function(){ someAction(); // выполняем интересующую функцию d.resolve(); // изменяем состояние Deferred-объекта на "выполнено" }, actTime); return d.promise(); } var defrr = test(); // устанавливаем обработчик выполнения Deferred-объекта defrr.done(function(){ alert("someAction выполнен"); }); // установим еще один обработчик, однако на этот раз // сделаем это на уже выполненном Deferred (спустя 15 сек) setTimeout(function() { alert("добавляем задачу поздно"); t.done(function(){ alert("someAction выполнен"); }); }, 15000); // в итоге, первый обработчик будет вызван сразу после выполнения someAction, // а второй только через некоторое время (сразу после установки), // поскольку он будет установлен с опозданием.
Как видно, с заместителем объекта deferred можно работать так же, как и с самим объектом. За исключением того, что с помощью заместитель нельзя изменить состояние замещаемого deferred.
Пример 2
Наделим произвольный объект методами заместителя:
var obj = {a:1, b:"text"}; var def = $.Deferred(); var promise = d.promise(obj); // Теперь переменные promise и obj будут содержать один объект, который // будет обладать полями и методами и объекта obj и заместителя def alert(promise.a); // выведет на экран "1" alert(obj.isResolved()); // выведет на экран false