2014-01-05 13 views
10

Um eine Webanwendung reaktionsfähig zu machen, verwenden Sie asynchrone nicht blockierende Anfragen. Ich kann mir zwei Möglichkeiten vorstellen, dies zu erreichen. Einer ist, aufgeschobene/Versprechen zu verwenden. Der andere ist Web-Arbeiter. Mit Web-Mitarbeitern führen wir einen weiteren Prozess ein, und wir müssen uns den Aufwand leisten, Daten hin und her zu übertragen. Ich suchte nach einer Art von Leistungsmesswerten, um zu verstehen, wann einfache nicht blockierende Rückrufe über Web-Mitarbeiter gewählt werden sollten.web worker vs provents

Gibt es einen Weg der Formulierung, der verwendet werden kann, ohne beide Ansätze zu prototypieren? Ich sehe viele Tutorials online über Web-Arbeiter, aber ich sehe nicht viele Erfolg/Misserfolg-Geschichten. Ich weiß nur, dass ich eine reaktionsschnelle App brauche. Ich denke, einen Netzarbeiter als die Schnittstelle zu einer In-Gedächtnis Datenstruktur zu verwenden, die irgendwo von 0.5-15MB (im Wesentlichen eine DB) sein kann, die der Benutzer abfragen und aktualisieren kann.

Wie ich Javascript Verarbeitung verstehe, ist es möglich, eine einzige lang laufende Aufgabe zu nehmen und es aufzuteilen, so dass es regelmäßig Kontrolle gibt, die anderen Aufgaben ein Stück Verarbeitungszeit erlaubt. Wäre das ein Zeichen dafür, Web-Arbeiter zu benutzen?

+0

Das war die Idee: https://github.com/nolanlawson/promise-worker – Mario

Antwort

21

Latente/Promises und Webworkers adressieren unterschiedliche Bedürfnisse:

  • Latente/Versprechen Konstrukte sind eine Referenz auf ein Ergebnis noch nicht verfügbar zuweisen, und den Code zu organisieren, dass das Ergebnis wird einmal verfügbar oder ein Fehler wird ist zurück gekommen.

  • Web Arbeiter asynchron eigentliche Arbeit ausführen (Betriebssystem Threads nicht Prozesse - sie sind also relativ geringes Gewicht)

Mit anderen Worten, JavaScript Single-Threaded ist, können Sie nicht/Versprechen latenten verwenden zu run Code asynchron - sobald der Code ausgeführt wird, der das Versprechen erfüllt, wird kein anderer Code ausgeführt (Sie können die Reihenfolge der Ausführung ändern, z. B. mit setTimeout(), aber das macht Ihre Webanwendung per se nicht reaktionsfähiger) . Dennoch könnten Sie irgendwie in der Lage sein, die Illusion einer asynchronen Abfrage durch z.B. Iterieren über ein Array von Werten durch Inkrementieren des Index alle paar Millisekunden (z.B. unter Verwendung von setInterval), aber das ist kaum praktikabel.

Um Arbeiten wie Ihre Abfrage asynchron auszuführen und damit diese Arbeit von der Benutzeroberfläche Ihrer App zu laden, benötigen Sie etwas, das tatsächlich asynchron funktioniert. Ich sehe mehrere Möglichkeiten:

  • ein IndexedDB verwenden, das eine asynchrone API bietet,

  • Ihre eigene In-Memory-Datenstruktur ausführen und Web-Arbeiter verwenden, da Sie angegeben hat, die eigentliche Abfrage durchzuführen,

  • Verwendung eines serverseitige Skript-Engine wie NodeJS Ihren Code auszuführen, dann Client-seitige ajax verwenden, um die Abfrage (plus ein Versprechen, die Ergebnisse zu verarbeiten) zu starten,

  • verwenden Sie eine über HTTP zugängliche Datenbank (z. Redis, CouchDB) und vom Client ein asynchrones GET (d. H. Ajax) ausgeben, um die Datenbank abzufragen (plus ein Versprechen, die Ergebnisse zu verarbeiten), um eine hybride Webanwendung zu entwickeln, die z.Parse

Welcher Ansatz ist in Ihrem Fall der beste? Fest ohne genaue Anforderungen zu sagen, aber hier sind die Dimensionen ich aussehen würde:

  • Codekomplexität - wenn Sie bereits Code für Ihre Datenstruktur haben, ist wahrscheinlich Web-Arbeiter eine gute Passform, sonst IndexedDB sinnvoller aussieht.
  • Leistung - Wenn Sie konsistente Leistung benötigen, scheint eine serverseitige Implementierung oder DB geeigneter zu sein
  • Architektur/Komplexität - Möchten Sie, dass die gesamte Verarbeitung clientseitig erfolgt oder können Sie sich die Verwaltung einer serverseitigen Implementierung leisten?

Ich fand this book eine nützliche lesen.

+0

Hätten Sie etwas dagegen, ein konkreter Beispiel Szenarien von Promise/WebWrokers Nutzung bitte zur Verfügung stellen? Etwas, das wir mit der Benutzeroberfläche verknüpfen können. Vielen Dank! –