jQuery.when( deferreds )Возвращает: Promise
Описание: Предоставляет способ выполнения функций обратного вызова на основе нуля или более объектов Thenable, обычно объектов Deferred, представляющих асинхронные события.
-
версия добавлена: 1.5jQuery.when( deferreds )
- deferredsНоль или более объектов Thenable.
-
Если в jQuery.when() не переданы аргументы, будет возвращена разрешенная Promise.
Если в jQuery.when() передаётся один Deferred, метод возвращает его Promise объект (подмножество методов Deferred). Дополнительные методы объекта Promise могут быть вызваны для присоединения функций обратного вызова, таких как deferred.then. Когда Deferred разрешается или отклоняется, обычно кодом, создавшим Deferred, будут вызваны соответствующие функции обратного вызова. Например, объект jqXHR, возвращаемый jQuery.ajax() — это совместимый с Promise объект, который может быть использован таким образом:
$.when( $.ajax( "test.aspx" ) ).then(function( data, textStatus, jqXHR ) {
alert( jqXHR.status ); // Alerts 200
}); Если в jQuery.when() передаётся один аргумент, и он не является Deferred или Promise, он будет обработан как разрешенный Deferred, и любые прикреплённые doneCallbacks будут выполнены немедленно. doneCallbacks получают исходный аргумент. В этом случае любые failCallbacks, которые вы можете установить, никогда не будут вызваны, так как Deferred никогда не отклоняется. Например:
$.when( { testing: 123 } ).done(function( x ) {
alert( x.testing ); // Alerts "123"
}); Если вы вообще не передаёте аргументов, jQuery.when() вернёт разрешённую promise.
$.when().then(function( x ) {
alert( "I fired immediately" );
}); В случае, когда в jQuery.when() передаётся несколько объектов Deferred, метод возвращает Promise от нового "главного" объекта Deferred, который отслеживает агрегатное состояние всех Deferred, которые ему были переданы. Метод разрешит свой главный Deferred, как только все Deferred разрешатся, или отклонит главный Deferred, как только один из Deferred будет отклонен. Если главный Deferred разрешается, выполняются doneCallbacks для главного Deferred. Аргументы, переданные doneCallbacks, предоставляют разрешенные значения для каждого из Deferred, и соответствуют порядку, в котором Deferred были переданы в jQuery.when(). Например:
var d1 = $.Deferred();
var d2 = $.Deferred();
$.when( d1, d2 ).done(function ( v1, v2 ) {
console.log( v1 ); // "Fish"
console.log( v2 ); // "Pizza"
});
d1.resolve( "Fish" );
d2.resolve( "Pizza" ); В случае, когда Deferred был разрешён без значения, соответствующий аргумент doneCallback будет undefined. Если Deferred был разрешён с единственным значением, соответствующий аргумент будет содержать это значение. В случае, когда Deferred был разрешён с несколькими значениями, соответствующий аргумент будет массивом этих значений. Например:
var d1 = $.Deferred();
var d2 = $.Deferred();
var d3 = $.Deferred();
$.when( d1, d2, d3 ).done(function ( v1, v2, v3 ) {
console.log( v1 ); // v1 is undefined
console.log( v2 ); // v2 is "abc"
console.log( v3 ); // v3 is an array [ 1, 2, 3, 4, 5 ]
});
d1.resolve();
d2.resolve( "abc" );
d3.resolve( 1, 2, 3, 4, 5 ); В случае с несколькими Deferred, где один из Deferred отклоняется, jQuery.when() немедленно вызывает failCallbacks для своего главного Deferred. Обратите внимание, что некоторые Deferred могут всё ещё не быть разрешены на этом этапе. Аргументы, передаваемые failCallbacks, соответствуют сигнатуре failCallback для Deferred, который был отклонен. Если вам нужно выполнить дополнительную обработку для этого случая, например, отменить любые незавершенные запросы Ajax, вы можете сохранить ссылки на базовые объекты jqXHR в замыкании и проверить/отменить их в failCallback.
Примеры:
Выполнение функции после успешного выполнения двух запросов Ajax. (См. документацию jQuery.ajax() для полного описания успешных и ошибочных случаев для запроса ajax).
$.when( $.ajax( "/page1.php" ), $.ajax( "/page2.php" ) ).done(function( a1, a2 ) {
// a1 and a2 are arguments resolved for the page1 and page2 ajax requests, respectively.
// Each argument is an array with the following structure: [ data, statusText, jqXHR ]
var data = a1[ 0 ] + a2[ 0 ]; // a1[ 0 ] = "Whip", a2[ 0 ] = " It"
if ( /Whip It/.test( data ) ) {
alert( "We got what we came for!" );
}
}); Выполнение функции myFunc при успешном выполнении обоих запросов ajax или myFailure при ошибке в одном из них.
$.when( $.ajax( "/page1.php" ), $.ajax( "/page2.php" ) ) .then( myFunc, myFailure );