deferred.then( doneFilter [, failFilter ] [, progressFilter ] )Возвращает: Promise
Описание: Добавляет обработчики, которые будут вызываться, когда объект Deferred разрешен, отклонен или находится в процессе выполнения.
-
версия добавлена: 1.8deferred.then( doneFilter [, failFilter ] [, progressFilter ] )
-
версия добавлена: 1.5, удалена: 1.8deferred.then( doneCallbacks, failCallbacks )
-
версия добавлена: 1.7, удалена: 1.8deferred.then( doneCallbacks, failCallbacks [, progressCallbacks ] )
До jQuery 1.8, аргументы могли быть функцией или массивом функций.
Для всех подписей аргументы могут быть null если callback этого типа не требуется. В качестве альтернативы, используйте .done(), .fail() или .progress() для установки только одного типа callback без фильтрации статуса или значений.
Начиная с jQuery 1.8, метод deferred.then() возвращает новую promise, которая может фильтровать статус и значения deferred с помощью функции, заменяя устаревший метод deferred.pipe(). Функции doneFilter и failFilter фильтруют исходный статус resolved/rejected и значения deferred. Функция progressFilter фильтрует любые вызовы методов исходного deferred notify или notifyWith. Эти функции фильтра могут вернуть новое значение, которое будет передано callback функции promise .done() или .fail(), или они могут вернуть другой наблюдаемый объект (Deferred, Promise и т.д.), который передаст свой статус resolved/rejected и значения callback функциям promise. Если используемая функция фильтра равна null, или не указана, promise будет разрешен или отклонен с теми же значениями, что и исходный.
Callbacks выполняются в том порядке, в котором они были добавлены. Поскольку deferred.then возвращает Promise, к этому методу можно привязать другие методы объекта Promise, включая дополнительные методы .then().
Примеры:
Поскольку метод jQuery.get возвращает объект jqXHR, который является производным от объекта Deferred, мы можем прикрепить обработчики, используя метод .then.
$.get( "test.php" ).then(
function() {
alert( "$.get succeeded" );
}, function() {
alert( "$.get failed!" );
}
); Фильтр значения resolve:
<!doctype html>
<html lang="en">
<head>
<meta charset="utf-8">
<title>deferred.then demo</title>
<script src="https://code.jquery.com/jquery-3.7.0.js"></script>
</head>
<body>
<button>Filter Resolve</button>
<p></p>
<script>
var filterResolve = function() {
var defer = $.Deferred(),
filtered = defer.then(function( value ) {
return value * 2;
});
defer.resolve( 5 );
filtered.done(function( value ) {
$( "p" ).html( "Value is ( 2*5 = ) 10: " + value );
});
};
$( "button" ).on( "click", filterResolve );
</script>
</body>
</html> Демо:
Фильтр значения reject:
var defer = $.Deferred(),
filtered = defer.then( null, function( value ) {
return value * 3;
});
defer.reject( 6 );
filtered.fail(function( value ) {
alert( "Value is ( 3*6 = ) 18: " + value );
}); Цепочка задач:
var request = $.ajax( url, { dataType: "json" } ),
chained = request.then(function( data ) {
return $.ajax( url2, { data: { user: data.userId } } );
});
chained.done(function( data ) {
// data retrieved from url2 as provided by the first request
});