deferred.promise( [target ] )Возвращает: Promise
Описание: Возвращает объект Promise от Deferred.
-
версия добавлена: 1.5deferred.promise( [target ] )
- targetТип: ОбъектОбъект, на который необходимо прикрепить методы promise
-
Метод deferred.promise() позволяет асинхронной функции предотвратить вмешательство другого кода в ход или состояние её внутреннего запроса. Promise предоставляет только методы Deferred, необходимые для подключения дополнительных обработчиков или определения состояния (then, done, fail, always, pipe, progress, state и promise), но не те, которые изменяют состояние (resolve, reject, notify, resolveWith, rejectWith, и notifyWith).
Если target указан, deferred.promise() прикрепит методы к нему и вернёт этот объект вместо создания нового. Это может быть полезно для прикрепления поведения Promise к уже существующему объекту.
Если вы создаёте Deferred, сохраните ссылку на Deferred, чтобы его можно было разрешить или отклонить в какой-то момент. Верните только объект Promise через deferred.promise(), чтобы другой код мог зарегистрировать обратные вызовы или проверить текущее состояние.
Для получения дополнительной информации см. документацию для объекта Deferred.
Примеры:
Создайте Deferred и установите две функции, основанные на таймерах, для разрешения или отклонения Deferred через случайный интервал. Та которая сработает первой "выигрывает" и вызовет один из обратных вызовов. Второй таймаут не имеет эффекта, так как Deferred уже завершён (в состоянии разрешён или отклонён) из-за действия первого таймаута. Также установите функцию уведомления о прогрессе, основанную на таймере, и вызовите обработчик прогресса, который добавляет "работаем..." в тело документа.
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 );
}
); Используйте аргумент target для повышения существующего объекта до уровня Promise:
// Existing object
var obj = {
hello: function( name ) {
alert( "Hello " + name );
}
},
// Create a Deferred
defer = $.Deferred();
// Set object as a promise
defer.promise( obj );
// Resolve the deferred
defer.resolve( "John" );
// Use the object as a Promise
obj.done(function( name ) {
obj.hello( name ); // Will alert "Hello John"
}).hello( "Karl" ); // Will alert "Hello Karl"