48 votes

pourquoi underscore defer résout-il tant de mes problèmes ?

Après avoir utilisé backbone pendant quelques semaines, j'ai réalisé que underscore defer a fini par résoudre de nombreux problèmes asynchrones que j'ai rencontrés lors du rendu de diverses vues. Quelqu'un peut-il m'aider à comprendre exactement ce que fait underscore defer et en quoi il est différent de $.ready() ou d'autres types de fonctions d'attente de rendu de dom. Quels sont les inconvénients de son utilisation ?

_.defer = function(func) {
    return _.delay.apply(_, [func, 1].concat(slice.call(arguments, 1)));
};

74voto

Alex Wayne Points 58113
# These are equivalent
_.defer(fn);
setTimeout(fn, 1);

Alors defer est simplement une milliseconde setTimeout . (Il possède quelques autres caractéristiques de commodité, mais elles ne sont pas importantes ici).


JavaScript a des boucles d'exécution. C'est un thread unique, mais son exécution commence et s'arrête en fonction d'événements ou de temporisations. Chaque fois que votre moteur JS se met en marche pour exécuter du code, il lance une itération de sa boucle d'exécution.

Alors quoi ? defer est de dire "exécuter ce code dans la prochaine boucle d'exécution".

_.defer(function() { alert('after'); });
alert('before');

Ces alertes "avant" et ensuite "après". En effet, la boucle d'exécution en cours se termine par l'alerte "avant", et juste après, une nouvelle boucle d'exécution démarre et exécute le code de l'alerte "après".

Ainsi, chaque fois que vous avez du code ici, mais que vous voulez qu'il exécute d'abord le code qui se produit après ce code, alors vous utiliseriez defer .

_.defer(functionToRunLast);
functionToRunFirst();

Cela peut être pratique avec le DOM. Parfois, vous le modifiez, mais les changements ne sont pas analysés ou rendus immédiatement. À la fin de la boucle d'exécution, le navigateur rattrape son retard, analyse et rend le DOM, puis la boucle d'exécution suivante commence et peut interagir avec le DOM nouvellement rendu.

(Je ne suis pas sûr des scénarios exacts qui provoquent ce retard dans l'analyse du DOM, mais je l'ai remarqué dans mes propres projets par le passé).


Il est NO un remplacement pour DOM ready. La prochaine boucle d'exécution peut se produire antes de DOM ready ever fires, ne confondez pas ces concepts.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X