Die Situation: Zu viel Zeug läuft im Hauptthread einer Seite, die eine Google-Karte mit Überlagerungen herstellt, die die ZIP-Territorien von den US-Volkszählungsdaten und von Sachen darstellen, die der Kunde gebeten hat, Gebiete in den diskreten Gruppen zu gruppieren. Während es auf Desktops keine größeren Probleme gibt, entscheiden mobile Geräte (iPad), dass der Thread zu lange dauert (max. 6 Sekunden nach Datenrückgabe) und daher abgestürzt sein müssen.Verwenden von Google Map-Objekten in einem Web-Worker?
Lösung: Laden Sie die Schleifenfunktion ab, um die Punkte für die Form von jeder Zeile zu einem Web-Mitarbeiter zu sammeln, der so schnell oder langsam arbeitet, wie es Ressourcen auf einem mobilen Gerät zulassen. (Drei für Schleifen, 1. zur Auswahl der Zeile, 2. zur Auswahl der Spalte, 3. für jeden Punkt innerhalb der Spalte. Ausführungszeit: insgesamt 3-6 Sekunden für mehr als 2000 Zeilen mit zahlreichen Punkten)
Der Haken: In Damit dies richtig funktioniert, müssen die Punkte innerhalb des Netzarbeiters in eine Form (Polygon) gebracht werden. Da es sich jedoch um ein google.maps.polygon-Objekt handelt, das aus google.maps.latlng-Objekten besteht, muss [der Web-Worker] etwas darüber wissen, was diese Elemente im Web-Worker sind. Web-Worker verlangen, dass Sie das Fenster oder das DOM nicht verwenden, so dass das Skript importiert werden muss und dass nur das Objekt als JSON-kodiertes Objekt zurückgegeben werden soll. Der Code schlägt bei jeder Referenz von Google-Objekten sogar mit importScript() fehl, da diese Elemente auf dem Fensterelement beruhen.
Weitere Komplikationen: Googles API ist technisch proprietär. Der Web-App-Code, für den dies vorgesehen ist, ist an die NDA gebunden, so dass gezielte Fragen gestellt werden können, jedoch kein Kopieren/Einfügen des gesamten Codes.
Die Lösung/irgendwelche vagen Ideen: ???
TLDR: Sie müssen auf das Objekt google.maps.latlng zugreifen und neue Instanzen von (minimal) innerhalb eines Web Worker erstellen. Web-Worker sollte entweder Objekte zurückgeben, die in ein google.maps.polygon-Objekt eingefügt werden sollen, oder ein google.maps.polygon-Objekt zurückgeben. Wie referenziere ich die Google Maps-API, wenn ich die Standardmethode zum Importieren von Skripts aufgrund eines Problems, das das Fensterobjekt erfordert, nicht verwenden kann?
UPDATE: Da dieses Buch geschrieben Ive die Mehrheit der Grunzenarbeit vom Hauptthread zu dem Web-Arbeiter abzuwälzen verwalten ermöglicht es asynchron durch die Daten zu analysieren und die Daten zuweisen, um benutzerdefinierte latlng Objekt gemacht.
Der Fang erhält nun die zurückgegebenen Werte, um die Funktion im richtigen Kontext auszuführen, um zu sehen, ob die benutzerdefinierte Länge ausreicht, damit google.maps.polygon seine Magie entfaltet.
Auszug aus der Datei, die die Web-Arbeiter ruft und wartet auf seine Antwort (Coffee)
@shapeWorker.onmessage= (event)->
console.log "--------------------TESTING---------------"
data=JSON.parse(event.data)
console.log data
@generateShapes(data.poly,data.center,data.zipNum)
Aus irgendeinem Grund seine versucht GenerateShapes im Rahmen des Web-Arbeiter zu bewerten, anstatt im Rahmen der Die Klasse ist in.
Möglicherweise können Sie mit postMessage() Informationen aus dem Hauptthread "anfordern". Übergeben Sie die Anforderung an eine Funktion, die die entsprechende JSON-Zeichenfolge zurückgeben kann. https://developer.mozilla.org/en-US/docs/Web/Guide/Performance/Using_web_workers – daekano
Was würde ich verlangen, dass ein ImportScript() in diesem Fall nicht zur Verfügung stellen könnte? – TechImp
Nur ein Shot-in-the-Dark hier ... würde das iPad nicht denken, dass es abgestürzt ist, wenn Sie einen Teil des DOM jede Sekunde oder so aktualisiert ?? – TonyWilk