jQuery Deferred
имеет две функции, которые могут использоваться для реализации асинхронной цепочки функций:
then()
deferred.then( doneCallbacks, failCallbacks ) Returns: Deferred
doneCallbacks Функция или массив функций, вызываемых при разрешении отложенного.
failCallbacks Функция или массив функций, вызываемых при отклонении Отложенного.
pipe()
deferred.pipe( [doneFilter] [, failFilter] ) Returns: Promise
doneFilter Необязательная функция, вызываемая при разрешении Отложенного.
failFilter Необязательная функция, вызываемая при отклонении Отложенного.
Я знаю, что then()
было вокруг немного больше, чем pipe()
, поэтому последнее должно добавить дополнительную выгоду, но какая разница именно ускользает от меня. Оба имеют почти одинаковые параметры обратного вызова, хотя они отличаются по названию, и разница между возвратом Deferred
и возвратом Promise
кажется незначительной.
Я читал официальные документы снова и снова, но всегда считаю их слишком "плотными", чтобы действительно обернуть мою голову, и поиск нашел много обсуждений одной или другой функции, но я не нашел ничего, что действительно разъясняет разные плюсы и минусы каждого.
Итак, когда лучше использовать then
, и когда лучше использовать pipe
?
Добавление
Отличный ответ Феликса действительно помог прояснить, как эти две функции отличаются. Но мне интересно, есть ли моменты, когда функциональность then()
предпочтительнее функциональности pipe()
.
Очевидно, что pipe()
более мощный, чем then()
, и кажется, что первое может делать все, что может сделать последнее. Одной из причин использования then()
может быть то, что его имя отражает его роль как завершения цепочки функций, обрабатывающих одни и те же данные.
Но существует ли прецедент, для которого требуется then()
вернуть исходный Deferred
, который не может быть выполнен с помощью pipe()
из-за того, что он возвращает новый Promise
?