pipe () puis () documentation vs réalité dans jQuery 1.8

Mise à Jour: Cette question est maintenant obsolète, car la documentation est précise et à jour.

J'ai exploré l'API jQuery Deferred / Promise pendant un moment et je suis très confus au sujet des différences entre pipe() et then() philosophiquement et dans la documentation jQuery. J'ai trouvé que pipe () est juste un alias pour then () à partir de jQuery 1.8.

À partir de la source jQuery:

// Keep pipe for back-compat
promise.pipe = promise.then;

Pourtant, la documentation est complètement différent de pipe() et then() comme ils soi-disant avoir des utilisations entièrement différentes.

Description pour then():

Description: ajouter des gestionnaires à appeler lorsque l'objet différé est résolu ou rejeté.

Description pour pipe():

Description: méthode utilitaire pour filtrer et / ou Déferrer des chaînes.

Je comprends qu'historiquement ils avaient un comportement légèrement différent, mais dans l'ensemble de la documentation pour pipe ou la documentation pour alors , Il ne dit même pas que ces deux fonctions font exactement la même chose maintenant.

Alors, voici ma question en deux parties:

  1. pourquoi la documentation entre pipe() et then() diffère-t-elle à partir de jQuery 1.8?
  2. Pourquoi then() renvoie-t-il un nouvel objet différé? Ce comportement est complètement non documenté (les documents disent simplement qu'il renvoie un différé, pas que ce soit un nouveau). Je comprends qu'il a l'utilité de le faire (à savoir mettre en œuvre tous les Caractéristiques de pipe()), mais philosophiquement pourquoi est-ce le cas? C'est inutile étant donné la description de then() (pour attacher des gestionnaires).

Mise à Jour

J'irai même jusqu'à dire que les documents then() sont trompeurs et inexacts:

Depuis reporté.alors renvoie l'objet différé , d'autres méthodes de l'objet différé peuvent être enchaînées à celui-ci, y compris supplémentaires .alors() méthodes.

Peut-être que c'est juste vague, mais ça implique qu'il renvoie l'objet différé que vous avez appelé then() pour le chaînage, alors qu'en réalité il renvoie un objet entièrement nouveau....

Mettre À Jour À Nouveau

Semble que la documentation est simplement fausse / obsolète! Donc, cela répond Pourquoi la documentation ne fait aucune mention d'eux étant la même chose. Cependant, ma deuxième question est toujours valable. La raison pour laquelle then() renvoie un nouveau différé simplement pour qu'il et pipe() puissent être rendus équivalents?

30
demandé sur Adam Terlson 2012-08-17 23:20:28

1 réponses

La mise à jour de la documentation pour jQuery 1.8 n'est pas encore en ligne.

Selon Ce billet de blog récent :

Nous sommes en train de mettre à jour la documentation de L'API pour tous les changements à 1.8, mais pour l'instant vous pouvez vous référer au changelog dans le annonce jquery 1.8 pour voir ce qui a changé.

mise à Jour: Oui then() retourne une nouvelle Deferred, car , il est équivalent à pipe() maintenant. Je suis assez confiant le la mise à jour de la documentation clarifiera cela bientôt.

mise à jour supplémentaire pour l'exhaustivité: la documentation a été récemment mise à jour et dit maintenant pour pipe():

Avis de dépréciation: à partir de jQuery 1.8, la méthode deferred.pipe() est obsolète. La méthode deferred.then(), qui la remplace, devrait être utilisé à la place.

Et pour alors():

Avant jquery 1.8 , les arguments pouvaient être une fonction ou un tableau de fonction.

[...]

À partir de jQuery 1.8, la méthode deferred.then() renvoie une nouvelle promesse qui peut filtrer l'état et les valeurs d'un différé via un fonction, remplaçant la méthode deferred.pipe() maintenant obsolète. Le Les fonctions doneFilter et failFilter filtrent les différés d'origine statut et valeurs résolus / rejetés. La fonction progressFilter filtre tous les appels vers notify ou notifyWith méthode. Ces fonctions de filtre peuvent renvoyer une nouvelle valeur à transmettre le long des rappels .done() ou .fail() de la promesse, ou ils peuvent renvoie un autre objet observable (différé, promesse, etc.) qui transmettez son statut et ses valeurs résolus / rejetés à la promesse rappel. Si la fonction de filtre utilisée est null, ou non spécifiée, la promesse sera résolue ou rejetée avec les mêmes valeurs que original.

18
répondu Frédéric Hamidi 2013-01-27 19:15:14