еда полезней и вкусней.
410013796724260
• Webmoney
R335386147728
Z369087728698
Перейти к содержанию 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' |