web-dev-qa-db-fra.com

pourquoi le trait de soulignement diffère-t-il tant de mes problèmes?

Après avoir utilisé Backbone pendant quelques semaines, je me suis rendu compte que le report de soulignement a fini par résoudre de nombreux problèmes d'async que j'ai rencontrés concernant le rendu de diverses vues. Quelqu'un peut-il m'aider à comprendre exactement ce que le transfert de soulignement fait et en quoi est-il différent de $ .ready () ou d'un autre type d'attente de dom pour rendre les fonctions. Quels sont les inconvénients de son utilisation?

_.defer = function(func) {
    return _.delay.apply(_, [func, 1].concat(slice.call(arguments, 1)));
};
47
cesara
# These are equivalent
_.defer(fn);
setTimeout(fn, 1);

Donc defer est simplement une milliseconde setTimeout. (Il a quelques fonctionnalités supplémentaires mais elles ne sont pas importantes ici.)


JavaScript a exécuté des boucles. Il s'agit d'un seul thread, mais son exécution démarre et s'arrête en fonction des événements ou des temporisateurs. Chaque fois que votre moteur JS démarre pour exécuter du code, il démarre une itération de sa boucle d'exécution.

Donc ce que defer fait, c'est "exécuter ce code dans la prochaine boucle d'exécution".

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

Cela alerte "avant" puis "après". En effet, la boucle d'exécution actuelle conclut quelles alertes "avant", puis juste après une nouvelle boucle d'exécution démarre et exécute le code les alertes "après".

Donc, 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, vous utiliserez defer.

_.defer(functionToRunLast);
functionToRunFirst();

Cela peut être pratique avec le DOM. Parfois, vous le modifiez, mais les modifications ne sont pas analysées ou rendues immédiatement. À la fin de la boucle d'exécution, le navigateur rattrape et analyse et rend le DOM, puis la prochaine boucle d'exécution démarre et peut interagir avec le DOM nouvellement rendu.

(Exactement quels scénarios provoquent cette analyse DOM retardée, je ne suis pas sûr, mais je l'ai remarqué dans mes propres projets dans le passé.)


C'est PAS un remplacement pour DOM prêt. La prochaine boucle d'exécution peut se produire avant Le DOM est prêt à se déclencher, ne confondez pas ces concepts.

74
Alex Wayne