Метод deferred.pipe()

Определение и применение

Метод deferred.pipe() создаёт новую цепочку, преобразуя успешный результат, отказ или уведомление Deferred. Он полезен при чтении старого асинхронного кода, где из результата одной операции готовятся данные для следующей.

Синтаксис

JavaScript
const result = deferred.pipe(doneFilter, failFilter, progressFilter);

Параметры и возвращаемое значение

Все три функции необязательны; null позволяет пропустить соответствующий фильтр. doneFilter обрабатывает успешный результат, failFilter — отказ, progressFilter — уведомление. Без фильтра исходные значения передаются дальше.

Возвращается новый объект обещания jQuery с методами наблюдения за результатом. Обычное значение фильтра становится значением соответствующей ветви; возвращённое jQuery-обещание позволяет связать завершение с другой операцией. Исходный Deferred не изменяется.

Особенности и совместимость

Метод появился в 1.6, обработка прогресса — в 1.7; устарел с 1.8. В полной jQuery 4.0 он ещё существует, в slim отсутствует вместе с Deferred. Для нового кода используйте deferred.then().

Замена не всегда механическая: у .pipe() обычное значение, возвращённое фильтром отказа, остаётся отказом. В современной .then() успешно возвращённое значение обработчика отказа восстанавливает успешную ветвь. Отличаются также асинхронность и обработка исключений.

Документация

Пример старого кода

Преобразование суммы: попробуйте сами

Исходный Deferred завершится числом 100, новый результат после фильтра — числом 120. Используется jQuery 4.0.0.

index.html
HTML
<pre id="result"></pre>
main.js
JavaScript
const source = $.Deferred()
const result = source.pipe(function (amount) {
    return amount * 1.2
})
result.done(function (amount) {
    $('#result').text('Сумма: ' + amount)
})
source.resolve(100)