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