Метод 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 ); } );