Je suis un peu confus par cette question. Je pense que c’est parce que vous êtes confus par promise et delegate. Ce sont en fait des fonctionnalités de jQuery qui n’ont absolument rien à voir. Je vais expliquer chacune séparément :

delegate

delegate est une fonctionnalité de jQuery qui a été introduite dans jQuery 1.4.2. (C’est une approche plus agréable de la fonctionnalité live qui a été ajoutée dans jQuery 1.3). Elle résout un problème particulier qui vient avec la modification du DOM, et particulièrement avec les appels AJAX.

Lorsque vous liez un gestionnaire d’événement, vous le liez à une sélection. Ainsi, vous pourriez faire $('.special').click(fn)pour lier un gestionnaire d’événements à tous les membres de la classe special. Vous liez à ces éléments, donc si vous supprimez ensuite la classe d’un de ces éléments, l’événement sera toujours déclenché. Inversement, si vous ajoutez la classe à un élément (ou ajoutez un nouvel élément dans le DOM), il n’aura pas l’événement lié.

Il existe une fonctionnalité de Javascript qui atténue ce phénomène appelée « bouillonnement d’événements ». Lorsqu’un événement est déclenché, le navigateur notifie d’abord l’élément d’où provient l’événement. Ensuite, il remonte l’arborescence du DOM et notifie chaque élément ancêtre. Cela signifie que vous pouvez lier un gestionnaire d’événement sur un élément haut dans l’arbre DOM, et les événements déclenchés sur tous les éléments enfants (même ceux qui n’existent pas lorsque le gestionnaire a été lié).

delegate est l’implémentation de jQuery de ceci. Tout d’abord, vous sélectionnez un élément parent. Ensuite, vous spécifiez un sélecteur – le gestionnaire ne sera exécuté que si l’élément d’origine correspond à ce sélecteur. Ensuite, vous spécifiez un type d’événement, comme click, submit, keydown, tout comme avec bind. Et enfin, vous spécifiez le gestionnaire d’événement.

$('#containingElement').delegate('a.special', 'click', function() { alert('This will happen on all links with the special class');});

promesse

promise est un autre ajout relativement récent au jeu de fonctionnalités de jQuery. Il fait partie du concept Deferred qui a été introduit dans jQuery 1.5. (Je pense que la similitude de son entre « deferred » et « delegate » est probablement la source de la confusion). Il s’agit d’une manière d’abstraire les complications du code asynchrone. Le meilleur exemple de ceci est avec les appels AJAX, car l’objet retourné par $.ajax est un objet Deferred. Par exemple :

$.ajax({ url: 'somepage.cgi', data: {foo: 'bar'}}).done(function() { // this will be run when the AJAX request succeeds}).fail(function() { // this will be run when the AJAX request fails}).always(function() { // this will be run when the AJAX request is complete, whether it fails or succeeds}).done(function() { // this will also be run when the AJAX request succeeds});

C’est donc à bien des égards la même chose que de lier des gestionnaires de succès dans l’appel $.ajax, sauf que vous pouvez lier plus d’un gestionnaire, et vous pouvez les lier après l’appel initial.

Un autre moment où il serait utile de traiter de manière asynchrone est avec les animations. Vous pouvez fournir des callbacks aux fonctions, mais il serait plus agréable de le faire avec une syntaxe similaire à l’exemple AJAX que j’ai fourni ci-dessus.

Dans jQuery 1.6, cette fonctionnalité a été rendue possible, et promise fait partie de cette implémentation. Vous appelez promise sur une sélection jQuery, et vous obtiendrez un objet auquel vous pourrez lier des gestionnaires d’événements, lorsque toutes les animations de l’objet seront terminées.

Par exemple :

$('div.special').fadeIn(5000).promise().then(function() { // run when the animation succeeds}).then(function() { // also run when the animation succeeds});

Encore, l’effet est similaire aux méthodes traditionnelles, mais cela ajoute de la flexibilité. Vous pouvez lier les gestionnaires plus tard, et vous pouvez en lier plus d’un.

Summary

Basiquement, il n’y a pas de relation significative entre delegate et promise, mais ils sont tous deux des fonctionnalités utiles dans le jQuery moderne.

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée.