Фильтрация параметров deferred-обработчиков
Позволяет проводить предварительную обработку параметров, которые будут передаваться в обработчики смены состояния объекта deffered. Кроме того, способствует созданию цепочек deffered-объектов (когда выполнение одного объекта deffered, будет запускать процесс, за которым будет следить следующий deffered и т. д.). Замечание: pipe() относятся к методам объекта deferred, а не jQuery. Поэтому на объектах jQuery его вызывать не следует (например так: $("div").pipe(...)).
Создает promise-объект, состояние которого будет меняться вместе с исходным объектом deffered. Но в отличие от последнего, обработчики этого promise-объекта, будут получать предварительно обработанные с помощью заданных doneFilter и failFilter параметры.
doneFilter — функция, которая будет получать параметры, предназначенные для обработчика удачного выполнения исходного deffered-объекта. Возвращенное ей значение будет передано в качестве параметра в обработчик удачного выполнения promise-объекта (результат работы pipe()).
failFilter — то же, что и doneFilter, только для обработчиков неудачного выполнения.
Начиная с jQuery-1.7, в методе pipe() можно задать третий параметр, работающий с событием progress. Это событие происходит при вызове методов notify() и notifyWith() на объекте deferred.
doneFilter — совпадает с этим параметром в вышеописанном методе.
failFilter — совпадает с этим параметром в вышеописанном методе.
progressFilter — аналогичен двум другим параметрам, но для обработчиков прогресса выполнения объекта deferred.
Если вам нужно установить только failFilter (второй параметр метода), то pipe() следует вызвать так:
- someDeffered.pipe(null, failFilter);
а если только progressFilter, то соответственно так:
- someDeffered.pipe(null, null, progressFilter);
Содержание |
Примеры использования
Пример 1
Предварительная обработка параметров:
// создадим deferred и его заместителя с помощью pipe(), // обработчики заместителя будут получать параметр, увеличенный вдвое var defer = $.Deferred(), filtered = defer.pipe(function(value){ return value * 2; }); defer.resolve(5); // обработчики заместителя, возвращенного методом pipe(), // будут получать параметры умноженные на 2 filtered.done(function(value){ alert("полученный параметр ( 2*5 = 10): " + value); }); // а обработчики исходного deferred-объекта не измененные параметры defer.done(function(value){ alert("полученный параметр ( 5 ): " + value); });
Пример 2
Цепочка ajax-запросов. Перед тем, как выполнить основной запрос (по адресу url_1), будет произведен предварительный запрос идентификатора текущего пользователя (по адресу url_2). И уже после получения id, будет выполнено основной запрос, в данных которому будет фигурировать полученный идентификатор:
var request = $.ajax(url_1, {dataType: "json"}), chained = request.pipe(function( data ){ return $.ajax(url_2, {data: {user:data.userId} }); }); chained.done(function(data){ // data будет содержать ответ сервера на второй запроса (по url_2) });