Asynchrone Programmierung in Javascript (NICHT AJAX)

8

Ist es möglich, Dinge asynchron in Javascript (AJAX beiseite) zu tun? Zum Beispiel, um mehrere Arrays gleichzeitig zu iterieren. Wie wird es gemacht? Ein kurzes Beispiel wäre schön. Auf der Suche nach diesem war wegen der ganzen Ajax-Verschmutzung, die ich nicht suche, schwer.

Vielen Dank im Voraus.

    
aepheus 20.07.2010, 20:55
quelle

6 Antworten

9

Verwenden Sie Web Workers . Bedenken Sie jedoch, dass es sich um eine sehr neue Funktion handelt und nicht alle Browser vollständig unterstützt werden.

    
Teja Kantamneni 20.07.2010, 20:58
quelle
6

Sie könnten setTimeout verwenden.

%Vor%

Ich bin nicht sicher, wie es gleichzeitig sein wird, aber es ist ein asynchrones Programmiermodell.

    
Grumdrig 20.07.2010 21:01
quelle
4

Wie von Grumdrig angegeben, können Sie Code wie folgt schreiben:

%Vor%

Aber es wird immer noch nicht gleichzeitig ausgeführt. Hier ist eine allgemeine Vorstellung davon, was passiert, nachdem solche Timeouts aufgerufen wurden:

  • Jeder Code nach den setTimeout -Aufrufen wird sofort ausgeführt, einschließlich der Rückkehr zu aufrufenden Funktionen.
  • Wenn sich weitere Timer in der Warteschlange befinden, die ihre Verzögerungs- oder Intervallzeit erreicht oder überschritten haben, werden sie einzeln ausgeführt.
  • Während ein Timer läuft, könnte ein anderer seine Intervall- / Verzögerungszeit erreichen, aber er wird erst ausgeführt, wenn der letzte abgeschlossen ist.
  • Einige Browser geben Ereignissen Priorität, die von Benutzerinteraktionen ausgelöst werden, z. B. onclick und onmousemove . In diesem Fall werden die diesen Ereignissen zugeordneten Funktionen auf Kosten der Timergenauigkeit ausgeführt.
  • Dies wird fortgesetzt, bis es eine Öffnung gibt (keine zuvor benannten Timer oder Event-Handler, die die Ausführung anfordern). Nur dann werden die Funktionen im Beispielcode ausgeführt. Wieder eine nach der anderen, wobei die erste wahrscheinlich, aber nicht sicher zuerst ausgeführt wird. Außerdem wage ich zu vermuten, dass einige Browser eine minimale Verzögerungszeit vorschreiben, was dazu führen würde, dass alle Timer, die mit einer Verzögerung von 0 Millisekunden gesetzt werden, später als erwartet ausgeführt werden.

Offensichtlich gibt es keinen Leistungsvorteil beim Ausführen von Code wie diesem. In jedem Fall werden die Dinge länger dauern. Wenn jedoch eine einzelne Aufgabe so lange dauert, dass der Browser einfriert (und möglicherweise die Browserwarnungen "Skript dauert zu lange"), kann es hilfreich sein, sie in kleinere, schneller ausführende Teile zu zerlegen, die nach einer gewissen Verzögerungszeit sequenziell ablaufen So hat der Browser etwas Zeit zum Atmen.

Web Workers wurden erwähnt, und wenn Sie sich nicht um die IE-Kompatibilität kümmern, können Sie sie für echte Parallelität verwenden. Es gibt jedoch einige ernsthafte Einschränkungen hinsichtlich ihrer Verwendung, die aus Sicherheitsgründen auferlegt werden. Zum einen können sie nicht mit dem DOM interagieren, dh Änderungen an der Seite müssen immer noch synchron erfolgen. Außerdem werden alle Daten, die an und von Workern übergeben werden, während der Übertragung serialisiert, was bedeutet, dass echte JavaScript-Objekte nicht verwendet werden können. Für eine intensive Datenverarbeitung sind Web Worker wahrscheinlich eine bessere Lösung, als eine Funktion in mehrere zeitverzögerte Aufgaben aufzuteilen.

    
MooGoo 20.07.2010 21:48
quelle
2
Eine neue Entwicklung in diesem Bereich ist HTML5 Web Workers.

    
Jaanus 20.07.2010 20:57
quelle
1

JavaScript ist normalerweise single-threaded; Sie können nicht mehrere Dinge gleichzeitig tun. Wenn Ihr JavaScript-Code zu langsam ist, müssen Sie die Arbeit auslagern. Der neue Weg besteht darin, Web-Worker zu verwenden, wie andere bemerkt haben. Der alte Weg ist oft, AJAX zu verwenden und stattdessen die Arbeit auf dem Server zu erledigen. (Entweder mit Web Worker oder mit AJAX müssten die Arrays serialisiert und das Ergebnis deserialisiert werden)

    
Kathy Van Stone 20.07.2010 21:03
quelle
1

Ich muss MooGoo zustimmen, ich frage mich auch, warum Sie auf einmal so ein großes Array durchgehen würden.

Es gibt eine Erweiterung für JavaScript namens StratifiedJS , mit der Sie mehrere Dinge gleichzeitig ausführen können, solange sie asynchron sind. Auch Webworker sind eine peinliche "Lösung", die Dinge nur komplizierter macht, auch funktionieren sie nicht im IE.

In StratifiedJS könnten Sie einfach schreiben.

%Vor%     
tomg 26.09.2010 11:01
quelle

Tags und Links