2016-03-22 4 views
4

Ich möchte einen HTML5-Web-Worker verwenden, um in regelmäßigen Abständen Länge und Breite an einen erholsamen Server zu melden - auch wenn der Tab nicht im Fokus ist. Mein Problem ist, dass die Art und Weise, auf die ich normalerweise auf die HTML5-Funktion geolocation zugreifen würde, im Web-Worker nicht verfügbar ist.Verwenden von Geolocation in einem HTML5-Web-Worker

Ich habe versucht, das Geolocation-Objekt aus meiner Hauptdatei an den Web-Worker zu senden. Sie jedoch, dass nicht funktioniert hat und ich bekam die folgende Fehlermeldung:

Uncaught DataCloneError: Failed to execute 'postMessage' on 'Worker': An object could not be cloned.

Weiter habe ich versucht, eine JavaScript-Bibliothek importieren, das Geolocator genannt Geolocation-Services anbietet. Aber dann habe ich festgestellt, dass ich keinen Zugriff auf die Bibliothek im Worker habe (ich denke, weil der Worker keinen Zugriff auf das DOM hat).

Also, in einem Versuch, dies zu bekämpfen, fügte ich die Quelle dieser JavaScript-Bibliothek direkt in die Worker-Datei, aber das hat nicht funktioniert, weil ich keinen Zugriff auf window haben, die in der Quelle von Geolocator wiederholt verwendet wird .

Ist was ich versuche zu tun? Gibt es Alternativen, die ich nutzen kann?

Antwort

3

Das Objekt navigator im Hauptthread contains a geolocation property, mit dem Sie auf alle Geolocation-Funktionen zugreifen können.

Arbeiter enthalten eine different navigator object, known as WorkerNavigator, die nur eine Teilmenge der Eigenschaften der navigator im Hauptthread enthält.

Da der WorkerNavigator fehlt ein Geolocation Objekt und das Geolocation Objekt kann nicht in einen Arbeiter serialisiert werden, es scheint, dass Sie nicht Geolocation innerhalb einer Web-Arbeiter verwenden können. Stattdessen müssen Sie Ihre Berichte aus dem Hauptthread erstellen.

+0

Okay, das ist enttäuschend. Kennen Sie Web-Workers, die auch dann funktionieren, wenn ein Tab nicht im Fokus ist? – Haych

+2

@Haych Ich bin nicht, aber vielleicht könnte man einen Timer im Web-Arbeiter laufen lassen und dann den Haupt-Thread warnen, den REST-Aufruf auszuführen? Ich bin mir nicht sicher, ob das funktionieren würde, ich habe es nicht versucht. –

+0

Es gibt eine laufende Diskussion über [w3c repo] (https://github.com/w3c/ServiceWorker/issues/745), die im September 2015 über die mögliche Implementierung von Geolocation in ServiceWorker begann –

0

Es gibt ein funktionierendes Beispiel Ihres Vorschlags, der bei this Frage gefunden werden kann. Es funktioniert derzeit nur im Hintergrund in Firefox (aus den falschen Gründen) und ist im Gegensatz zu implementiert, bis wir einen wesentlichen Regimewechsel bei W3C/IETF haben.

Aber wie Sie gibt es viele solche Anforderungen gibt es in der realen Welt, und ich glaube, mein Vorschlag erfüllt die meisten, wenn nicht alle von ihnen.