Заместитель deferred

.promise()

Создает заместителя deferred-объекта (объект с аналогичным набором методов, за исключением отсутствия методов изменения состояния объекта. Предоставление заместителя вместо исходного объекта, гарантирует, что его состояние нельзя будет изменить из вне). Замечание: данный метод, относится к методам объекта deferred, а не jQuery. У последнего есть метод с таким же названием, однако его назначение немного отличается.

.promise([target]):promise1.5

Создает заместителя 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

Ссылки

Поисковые ключи:
  • отражение объекта deferred
  • заместитель объекта deferred
  • представитель объекта deferred
  • promise
  • .promise
  • deferred.promise