2016-06-02 17 views
1

Ich entwickle eine Webapp in Dart angular2. Wenn ich ein Formular abschicke, bleibt der Browser stecken (die Prozesszeit kann ziemlich lang sein). Gibt es eine Möglichkeit, es asynchron zu tun?Formular einreichen - wegen langem Prozess stecken

Ich habe in meiner Vorlage:

<form (ngSubmit)="onSubmit()" 

und das entsprechende Verfahren:

onSubmit() async { 
    longProcess(); 
} 

Die Methode 'longProcess()' nennen keinen Server. Nur lokale Berechnung.

Danke für Ihre Hilfe.

+0

Anrufe auf dem Server sind async standardmäßig. Ohne tatsächlichen Code zu sehen, der zeigt, was Sie erreichen möchten, ist es schwierig, Vorschläge zu machen. –

+0

Danke für Ihre schnelle Antwort, ich habe meine Frage aktualisiert. – matth3o

Antwort

1

longProcess() wird sehr wahrscheinlich bereits async ausgeführt.

Das Problem ist, dass der Browser nur einen Thread hat. Selbst wenn etwas asynchron verarbeitet wird, wird es im selben Thread ausgeführt, in dem auch JavaScript ausgeführt wird. Wenn eine Aufgabe ausgeführt wird, kann keine andere Aufgabe gleichzeitig aktiv sein. Wenn Sie die große Aufgabe in viele kleinere Aufgaben aufteilen und dann diese kleineren Aufgaben asynchron aufrufen, können andere wartende Aufgaben ausgeführt werden, bevor die nächste dieser kleineren Aufgaben ausgeführt wird.

JavaScript kann WebWorker verwenden, um zusätzliche zu erstellen. Wenn Code in einem solchen WebWorker-Thread ausgeführt wird, blockiert er den Hauptthread nicht.

Für weitere Informationen über Webworkers sehen Web workers in Angular 2 Dart

+0

Das macht Sinn, danke für Ihre Hilfe. – matth3o

+1

Ich würde hinzufügen, dass eine einfache Möglichkeit, dies zu lösen ist 'erwarten'-in' window.animationFrame' in Ihrer Arbeitsschleife in 'longProcess()'. Ich habe das in http://filiph.github.io/markov/ gemacht (suche nach "Markov-Kette im Browser erstellen"). Dies teilt die Berechnung effektiv in die kleineren Aufgaben, über die Gunther spricht. – filiph

+0

Danke, ich schaue es mir an ... Eigentlich habe ich den Trick mit der wunderbaren Funktion 'Isolate.spawn' gemacht :) – matth3o