Quel est le but de la promesse d’object JQuery?

Pendant quelques années, je m’occupais d’un problème à temps partiel: certains éléments du DOM chargés avec la fonction html jquery n’étaient pas accessibles immédiatement après l’appel de la fonction (le comportement ressemblait un peu à l’exécution d’une fonction sans attendre l’événement du document prêt). Même si .html() est supposé être synchrone, cette réponse SO (ainsi que celle- ci ) suggère d’utiliser la promesse de la fonction html :

 $('#divId').html("

hello

").promise().done(function(){ //Callback });

Une promesse pourrait avoir un sens dans un tel contexte, mais ce qui m’insortinggue dans cette promesse, c’est qu’elle sera également retournée avec l’object de chaque requête:

 $('#divId').promise().done(function(){ //Will also be called... }); 

N’ayant rien trouvé à ce sujet dans la documentation de la fonction html , je me demandais quel était le véritable objective de cette promesse et si elle était utilisée correctement dans ce contexte.

Les deux méthodes ne sont pas liées. Les gens suggèrent souvent que c’est parce que quelqu’un a découvert qu’ils pourraient utiliser .promise().done() pour que leur code fonctionne avec une condition de .promise().done() . Cela fonctionnait pour la même raison, le fait de travailler avec le même code dans setTimeout(fn, 0) ; il envoie la requête à la queue de rappel pour qu’elle soit exécutée ultérieurement, probablement après que le navigateur a effectué un rendu ou après la fin d’un autre rappel asynchrone.

.html est synchrone, n’a pas de rappel et n’a pas besoin de rappel. Toutefois, le moteur de rendu du navigateur est asynchrone. Par conséquent, il ne restituera pas les modifications tant que la stack d’appels n’est pas vide. L’utilisation de .promise pousse le rappel vers la queue de rappel, exécutant ainsi le code après un rendu qui résout la situation de concurrence critique ou la faille de la logique asynchrone.

.promise() utilisé dans une collection jquery renvoie une promesse qui sera résolue une fois que toutes les animations jquery en cours d’exécution seront terminées. Si aucune animation n’est en cours d’exécution, la promesse sera résolue immédiatement et le rappel sera poussé vers la queue des rappels à appeler une fois que la stack sera vide.

Ce n’est rien de plus qu’un pansement. Je suggérerais de ne pas l’utiliser, mais de réparer ce que la faille de la logique asynchrone est à l’origine de la solution.