Ограничение доступа
Ролевой механизм
Загрузка модулей410013796724260
|
Перейти к содержанию jQuery
Объект jQuery.DeferredВ jQuery версии 1.5 добавлен специальный объект jQuery.Deferred, который хранит состояние выполнения задачи. Объект может иметь один из следующих типов состояний : "еще не выполнено" (pending), "выполнено" (resolved), "ошибка при выполнении" (rejected). Кроме этого объект $.Deferred имеет методы для изменения состояния, а также методы для установки обработчиков, реагирующих на переход объекта из состояния "еще не выполнено" в другое состояние. Метод выполнения асинхронных запросов ajax использует deferred-объекты, позволяющие назначать довольно простым способом несколько обработчиков на события завершения запроса (успешного или ошибкой), а также назначать обработчики завершения нескольких параллельных запросов. Методы объекта $.Deferred
Создание Deferred объектаДля создания экземпляра Deferred можно воспользоваться функцией $.Deferred([function(obj)]), которая возвращает deferred-объект. В качестве аргумента можно использовать функцию, которая инициализирует объект. Внутри функции deferred-объект доступен в переменной this и в аргументе obj. Пример :
// создание объекта Deferred
let defd1 = $.Deferred();
// создание объекта Deferred с использованием обработчика
// успешного выполнения
let defd2 = $.Deferred (function(obj){
obj.done(successCallback);
});
Примеры использования Deferred объектаПример обработчиков .done, .fail, .then, .always
var defd = $.Deferred()
.done(function(){
console.log("Объект defd в состоянии resolved.");
})
.fail(function(){
console.log("Объект defd в состоянии rejected.");
})
.then(function(){
console.log("Объект defd в состоянии resolved.");
},function(){
console.log("Объект defd в состоянии rejected.");
})
.always(function(){
console.log("Объект defd в состоянии rejected/resolved");
});
Пример вызова метода progress
let defd = $.Deferred();
// подключение обработчиков прогресса и
// завершения операции
defd.progress(function(p){
console.log("Операция выполнена на " + p + "%");
}).done(function(){
console.log("Операция завершена!");
});
defd.notify(25);
defd.notify(50);
defd.notify(75);
defd.resolve();
Операция выполнена на 25% Операция выполнена на 50% Операция выполнена на 75% Операция завершена! Пример вызова метода resolve
// deferred-объект с обработчиком успешного выполнения
let defd1 = $.Deferred().done(function(){
console.log("defd1 в состоянии успешного выполнения");
});
// deferred-объект с обработчиком успешного выполнения,
// получающий два параметра
let defd2 = $.Deferred().done(function(arg1, arg2){
console.log("defd2 в состоянии успешного выполнения; "
+ "параметры: " + arg1 + ", " + arg2);
});
// изменим состояния объектов, сопровождающееся
// выполнением обработчиков
defd1.resolve();
defd2.resolve(10, "test");
defd1 в состоянии успешного выполнения defd2 в состоянии успешного выполнения; параметры: 10, test Пример события notify
let defd = $.Deferred();
// подключение обработчиков прогресса и
// завершения операции
defd.progress(function(p){
console.log("Операция выполнена на " + p + "%");
}).done(function(){
console.log("Операция завершена!");
});
defd.notify(25);
defd.notify(50);
defd.notify(75);
defd.resolve();
Операция выполнена на 25% Операция выполнена на 50% Операция выполнена на 75% Операция завершена! Пример вызова метода resolveWith
let defd = $.Deferred();
// подключение обработчика завершения операции
deff.done(function(a, b){
console.log("Контекст выполнения функции :"
+ "элемент '" + this.attr("id") + "'"
+ ", входные параметры : a=" + a
+ ", b=" + b);
});
deff.resolveWith($("#someElement"), [1, 2]);
Контекст выполнения функции, элемент 'someElement', \ входные параметры : a=1, b=2 Пример использования pipe Ниже представлен пример использования deffered-объекта и его заместителя с фильтрацией pipe.
// deferred-объект
let defd = $.Deferred();
// заместитель deferred-объекта с фильтрацией
let fltr = defd.pipe(function(value){
return value * 2;
});
// перевод в состояние resolved
defd.resolve(5);
// выполнение заместителя deferred-объекта
fltr.done(function(value){
console.log("параметр " + value + " (2*5 = 10)");
});
// обработчик deferred-объекта с неизмененным параметром
defd.done(function(value){
console.log("параметр " + value + " ( 5 )");
});
параметр 10 (2*5 = 10) параметр 5 ( 5 ) Пример использования promise
var obj = {a:1, b:"text"};
var defd = $.Deferred();
var prms = defd.promise(obj);
// значения заместителя
console.log(prms.a + ", " + prms.b);
// deferred-объект в состояние resolved
defd.resolve();
// состояния deferred-объекта и его заместителя
console.log("defd.state = " + defd.state());
console.log("prms.state = " + prms.state());
1, text defd.state = resolved prms.state = resolved Пример использования when
let defd1 = $.Deferred();
let defd2 = $.Deferred();
let defd = $.when(defd1, defd2);
defd.done(function(){
console.log("deferred-объекты в состоянии 'resolved'");
}).fail(function(){
console.log("один из deferred-объектов 'rejected'");
});
defd1.resolve();
defd2.reject();
один из deferred-объектов 'rejected' |
