Метод deferred.promise()

deferred.promise() –  создает заместителя deferred-объекта (объект с аналогичным набором методов, за исключением отсутствия методов изменения состояния объекта).

Это полезно, если вы хотите, чтобы API предоставлял возможность подписаться на события, но не давал возможности изменить состояние deferred объекта.

Замечание: данный метод, относится к методам объекта deferred, а не jQuery. У последнего есть метод с таким же названием, однако его назначение немного отличается.

deferred.promise( [target ] )

Создает заместителя deferred-объекта. Вместо создания нового объекта заместителя, можно наделить любой существующий объект всеми его свойствами и методами. Для этого нужно указать этот объект в параметре target. В результате, promise() вернет указанный объект, который будет обладать как первоначальными методами и полями, так и методами и полями заместителя.

Пример

Создадим объект deffered для функции asyncEvent, который отслеживается методом then в функциях обратного вызова. При этом, какой результат будет конечным (успешный или не успешный) заранее не известно, так как функция использует javascript интервал (setTimeout), второй параметр которого формируется на основе случайного числа.

function asyncEvent() {
  var dfd = jQuery.Deferred();
 
  // Resolve after a random interval
  setTimeout(function() {
    dfd.resolve( "hurray" );
  }, Math.floor( 400 + Math.random() * 2000 ) );
 
  // Reject after a random interval
  setTimeout(function() {
    dfd.reject( "sorry" );
  }, Math.floor( 400 + Math.random() * 2000 ) );
 
  // Show a "working..." message every half-second
  setTimeout(function working() {
    if ( dfd.state() === "pending" ) {
      dfd.notify( "working... " );
      setTimeout( working, 500 );
    }
  }, 1 );
 
  // Return the Promise so caller can't change the Deferred
  return dfd.promise();
}
 
// Attach a done, fail, and progress handler for the asyncEvent
$.when( asyncEvent() ).then(
  function( status ) {
    alert( status + ", things are going well" );
  },
  function( status ) {
    alert( status + ", you fail this time" );
  },
  function( status ) {
    $( "body" ).append( status );
  }
);

 

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *