2013-03-18 5 views
45

Nach der Verwendung von Backbone für ein paar Wochen habe ich festgestellt, dass Unterstrich Defer viele der async Probleme behoben, die ich in Bezug auf Rendern verschiedener Ansichten lief. Kann mir bitte jemand helfen, genau zu verstehen, was Unterstrich Defer tut und wie ist es anders, dass $ .ready() oder andere Art von warten auf Dom, um Funktionen zu rendern. Was sind die Nachteile bei der Verwendung?warum Unterstrich verschiebung beheben so viele meiner Probleme?

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

Nun, was macht '_delay'? Darin liegt die Antwort. –

+0

scheint es für 1 Millisekunde zu warten. Ich verstehe immer noch nicht, wie das weiß, dass bestimmte Elemente gerendert werden usw. Vielleicht benutze ich es falsch? – cesara

+0

Es kann hilfreicher sein, wenn Sie ein Beispiel für einen Ort posten, den Sie 'defer' verwenden mussten und warum nicht. –

Antwort

72
# These are equivalent 
_.defer(fn); 
setTimeout(fn, 1); 

So ist defer einfach eine Millisekunde setTimeout. (Es ist noch ein paar Komfortfunktionen bekam aber die sind hier nicht wichtig.)


JavaScript Schleifen gelaufen ist. Es ist single-threaded, aber seine Ausführung startet und stoppt basierend auf Ereignissen oder Timern. Jedes Mal, wenn Ihre JS-Engine startet, um Code auszuführen, startet sie eine Iteration ihrer Ausführungsschleife.

Also was defer tut, ist sagen "diesen Code in der nächsten Laufschleife ausführen".

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

Diese Warnung "vor" und dann "nach". Dies liegt daran, dass die aktuelle Run-Schleife abschließt, welche Alerts "vor" sind, und gleich danach startet eine neue Run-Schleife und führt den Code die Alerts "nachher" aus.

Also immer wenn Sie Code hier haben, aber Sie möchten, dass Code ausgeführt wird, der nach diesem Code zuerst auftritt, dann würden Sie defer verwenden.

_.defer(functionToRunLast); 
functionToRunFirst(); 

Dies kann mit dem DOM praktisch sein. Manchmal ändern Sie es, aber die Änderungen werden nicht sofort analysiert oder gerendert. Am Ende der Ausführungsschleife holt der Browser auf und parst und rendert das DOM, dann startet die nächste Ausführungsschleife und kann mit dem neu gerenderten DOM interagieren.

(Genau das, was Szenarien verursachen diese DOM Parse verzögert, ich bin nicht sicher, aber ich habe es in meinen eigenen Projekten in der Vergangenheit bemerkt.)


Es ist NICHT ein Ersatz für DOM ready. Die nächste Laufschleife kann passieren vor DOM bereit immer feuert, diese Konzepte nicht zu verwechseln.

+3

Ich bin mir ziemlich sicher, dass das DOM sofort aktualisiert wird, aber das Rendering (und damit Dinge wie Größe und Positionierung) wird im Allgemeinen erst geschehen, nachdem der Browser die Kontrolle zurückerlangt hat; Aus diesem Grund benötigen Sie oft ein "Defer" (oder das Äquivalent "setTimeout"), wenn Sie Google Maps an etwas binden möchten, das Sie gerade hinzugefügt haben: Die Karte möchte wissen, wie groß die Dinge sind, aber diese Informationen sind erst verfügbar Browser bekommt eine Chance, es zu berechnen. –

+0

Danke Alex, das hilft sehr! – cesara

+0

Wie vergleicht _.defer() mit setTimeout (fn, 0) ?? – iamwhitebox

Verwandte Themen