Фильтрация параметров deferred-обработчиков

.pipe()

Позволяет проводить предварительную обработку параметров, которые будут передаваться в обработчики смены состояния объекта deffered. Кроме того, способствует созданию цепочек deffered-объектов (когда выполнение одного объекта deffered, будет запускать процесс, за которым будет следить следующий deffered и т. д.). Замечание: pipe() относятся к методам объекта deferred, а не jQuery. Поэтому на объектах jQuery его вызывать не следует (например так: $("div").pipe(...)).

.pipe([doneFilter],[failFilter]):promise1.6

Создает promise-объект, состояние которого будет меняться вместе с исходным объектом deffered. Но в отличие от последнего, обработчики этого promise-объекта, будут получать предварительно обработанные с помощью заданных doneFilter и failFilter параметры.

doneFilter — функция, которая будет получать параметры, предназначенные для обработчика удачного выполнения исходного deffered-объекта. Возвращенное ей значение будет передано в качестве параметра в обработчик удачного выполнения promise-объекта (результат работы pipe()).
failFilter — то же, что и doneFilter, только для обработчиков неудачного выполнения.

.pipe([doneFilter],[failFilter],[progressFilter]):promise1.7

Начиная с 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)
});

Ссылки

Поисковые ключи:
  • фильтрация параметров deffered
  • обработка параметров deffered
  • pipe
  • .pipe
  • deferred.pipe