Was ist der Unterschied zwischen $evalAsync und $timeout in AngularJS?
Habe ich mit AngularJS für eine kleine Weile jetzt, und haben festgestellt, die Notwendigkeit zu verwenden $timeout jeder einmal in eine Weile (Scheint in der Regel zu init-ein jQuery-plugin).
Kurzem habe ich versucht, um besser und mehr in die Tiefe Verständnis der digest-Zyklus, und ich kam in $evalAsync Funktion.
Wie es scheint, die Funktion ergibt ähnliche Ergebnisse wie die $timeout
, nur Sie nicht, es zu verzögern. Jedes mal, wenn ich verwendet habe $timeout
es wurde mit einer Verzögerung von 0, so, jetzt Frage ich mich, ob ich hätte $evalAsync
statt.
Gibt es irgendwelche grundlegenden Unterschiede zwischen den beiden? Welche Fälle würden Sie einen über den anderen? Ich hätte gerne ein besseres Gefühl, Wann welcher zu benutzen ist eine.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Habe ich vor kurzem beantwortet im Grunde diese Frage hier: https://stackoverflow.com/a/17239084/215945
(Die Antwort die links zu github Austausch mit Misko.)
Zusammenfassen:
Für diejenigen, die Gebäude-komplexe Anwendungen, bewusst sein, dass es eine Auswirkung auf die Leistung auf Ihre Wahl. Auch möchte ich komplett Daneben Beantwortung mit mehr technischen details:
$timeout(callback) wartet, bis der aktuelle digest-Zyklus durchgeführt werden (d.h. Winkel-Updates alle Modell und den DOM), dann wird es ausführen seine callback - potenziell beeinflussen eckig Modell - dann starten Sie eine vollständige
$apply
auf der root - $ - Bereich, und redigest alles.$evalAsync(callback), auf der anderen Seite, fügen Sie den Rückruf auf die aktuelle oder nächste, digest-Zyklus. Das bedeutet, wenn Sie sich innerhalb einer digest-Zyklus (z.B. in einer Funktion namens von einigen
ng-click
- Richtlinie), diese werden nicht warten, für nichts, der code wird sofort ausgeführt werden soll. Wenn Sie innerhalb einen asynchronen Aufruf, zum Beispiel einesetTimeout
eine neue digest-Zyklus ($apply
) ausgelöst werden.So, in Bezug auf die Leistungen ist es immer besser anzurufen
$evalAsync
, es sei denn, für Sie ist es wichtig, dass die anzeigen aktuell sind vor der Ausführung Ihres Codes, zum Beispiel, wenn Sie brauchen Zugang zu einigen DOm-Attribut wie die Elemente width und dergleichen.Wenn Sie möchten mehr details zu den unterschieden zwischen $timeout, $evalAsync, $digest, $gelten, ich lade Sie ein, Lesen Sie meine Antwort auf die andere Frage: https://stackoverflow.com/a/23102223/1501926
Auch sicher sein, Lesen Sie die Dokumentation:
x
aus Ihrem Bereich direkt, anstatt aus dem DOM, so dass Sie nicht haben, zu warten für nichts. Auch, sollten Sie besserng-style
mit css anstatt die veraltetewidth
Eigenschaft. Wenn Sie weitere Hilfe benötigen, öffnen Sie bitte eine neue Frage auf StackOverflow.