2013-07-30 10 views
6

Ich schreibe eine Anwendung mit JavaScript, HTML5 und AngularJS. Es muss nur mit ziemlich neuen Browsern arbeiten (zum Beispiel IE10, aber nicht IE9).Wie werden rechenintensive Aufgaben in der AngularJS-Anwendung ausgeführt?

An mehreren Stellen in der Anwendung werden rechenintensive Aufgaben wie XML-Parsing und base64-Decodierung ausgeführt. Diese könnten ziemlich große Datenmengen beinhalten (einige MB sind sicherlich eine Möglichkeit).

Wenn ich nur Dinge wie atob() oder DOMParser.parseFromString() aufrufen, werde ich einen nicht reagierenden Browser für Sekunden oder sogar Minuten bekommen. Dies ist für einen Benutzer eindeutig nicht akzeptabel.

Ich habe den Q-Dienst von Angular verwendet, um Dinge wie den Zugriff auf einen externen Web-Service asynchron zu machen und damit zu vermeiden, den Browser aufzuhängen, während ich auf eine Antwort warte. Aber solche Operationen haben bereits eine asynchrone API.

Was ist mit diesen compute-absichtlichen Aufgaben, die keine eigene asynchrone API haben?

Ich kann einige dieser Aufgaben ein wenig teilen, Verkettung verspricht. Hilft das überhaupt? Wird die Nachrichtenwarteschlange des Browsers am Ende jeder Aufgabe durchgeblättert?

Ich sehe die Existenz von "Web Workers", die richtige Multi-Threading bieten scheinen. Aber sie scheinen ziemlich schlechte Fähigkeiten zu haben, Objekte zu/von den Worker-Threads zu übertragen. Sicher scheint es so für jemanden wie mich aus C# .Net! Zum Beispiel möchte ich Angular-Dienste (eingebaut und meine eigenen) in die Aufgaben auf den Threads injizieren. Und ich möchte auch keine massiven Daten zwischen Threads kopieren.

Erzielen andere Personen reaktionsschnelle clientseitige Web-Apps, die ernsthafte Berechnungen beinhalten? Wenn ja, wozu verwenden sie das?

+0

Wie beim Injizieren von Services kann ein Worker-Thread eine globale Funktion importScripts ('script.js') verwenden - für den Fall, dass Sie ihn verpasst haben. Leider gibt es keine Lösung für das Problem des Kopierens von Daten. –

+1

Ich habe experimentiert und ich kann Angular selbst nicht dazu bringen, einen Arbeiter zu laden (es braucht Fenster und Dokument), also kann ich wohl nichts Angulares verwenden? – PeteAC

Antwort

3

Es klingt, als ob Sie nach dem Parallel.js library suchen.

Hier ist eine kurze Beschreibung der Bibliothek von ihrer Website ist.

„Parallel.js ist eine kleine Bibliothek für Multi-Core-Verarbeitung in Javascript Es wurde geschaffen, um alle Vorteile der immer Reifung web- nehmen Arbeiter API. "

Mir sind derzeit keine spezifischen Beispiele für die Verwendung von Parallel.js in Angular bekannt, aber ich bin mir sicher, dass es nicht zu schwierig wäre, die Bibliothek als Angular-Dienst zu integrieren.

Verwandte Themen