2016-04-07 12 views
0

an diesem Code Werfen Sie einen Blick:getCurrentPosition feuert nur einmal in Firefox

navigator.geolocation.getCurrentPosition(function(){ 
    console.log("a"); 
}); 
navigator.geolocation.getCurrentPosition(function(){ 
    console.log("b"); 
}); 

https://jsfiddle.net/DerekL/sxb3j2bv/

Nach der Genehmigung durch den Benutzer erteilt wird, würde ich erwarten, dass die Konsole

> "a" 
> "b" 
angemeldet haben

und tatsächlich ist das in Chrome passiert. Doch auf Firefox, aus irgendeinem Grund feuert es nur einmal und nur protokolliert "b":

> "b" 

Was kann ich dagegen tun? Ist das ein Fehler?

+0

In Chrom, müssen Sie erhalten haben ' "b"' und dann ' "a"' – Rayon

+0

Meine Vermutung ist, zweite 'navigator.geolocation.getCurrentPosition 'wird ebenfalls aufgerufen und überschreibt die erste Erlaubnisaufforderung. Wenn Sie die zweite Eingabeaufforderung zulassen, erhalten Sie "b" in der Konsole. Beachten Sie, dass jeder Browser über eigene Richtlinien und Methoden verfügt, um diese Berechtigung anzufordern._ [[Ref] (https://developer.mozilla.org/en-US/docs/Web/API/Navigator/geolocation)] – Rayon

+0

@RayonDabre Sie haben Recht. '" b "' kommt vor '" a "'. –

Antwort

0

Ich löste es durch die vorherige Anfrage Versprechen Wiederverwendung:

// Note that this is using AngularJS 
.service("demo_geolocation_service", function($q){ 
    var ongoingRequest = false; // This is to deal with strange Firefox behavior 
           // where .getCurrentPosition only fires callback once 
           // even when called multiple times 

    return function(){ 
     var deferred = $q.defer(); 

     if(!ongoingRequest){ 
      // store promise 
      ongoingRequest = deferred.promise; 
      navigator.geolocation.getCurrentPosition(function(pos){ 
       deferred.resolve({latitude: pos.coords.latitude, longitude: pos.coords.longitude}); 
       ongoingRequest = undefined; 
      }, function(){ 
       deferred.reject(); 
       ongoingRequest = undefined; 
      }); 
     }else{ 
      // reuse previous promise 
      ongoingRequest.then(function(latlng){ 
       deferred.resolve(latlng); 
      }, function(){ 
       deferred.reject(); 
      }); 
     } 

     return deferred.promise; 
    }; 
}) 
0

Ich glaube, das passiert, weil der zweite Aufruf ausgeführt wird, bevor der Benutzer die Standortberechtigung für die erste akzeptiert hat.

Sie möchten jedoch wahrscheinlich bei

navigator.geolocation.watchPosition suchen

anstatt mehrere Anforderungen machen die Position zu bekommen.

+0

Ich versuche nicht, mehrere Anrufe zu machen, um ständig meine internen Daten zu "aktualisieren". Der Grund, warum mein Code mehrere 'getCurrentPosition'-Aufrufe macht, ist, weil es verschiedene Module auf der Seite gibt, die Geolocation erfordern, was zu mehreren Aufrufen von' getCurrentPosition 'führt. –

+0

Wenn Sie keinen aktualisierten Speicherort benötigen, rufen Sie getCurrentPosition einmal auf, speichern Sie den zurückgegebenen Wert, und verwenden Sie den Wert an anderer Stelle. –