# 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.