2016-04-07 4 views
0

Посмотрите на этот код:getCurrentPosition только срабатывает один раз в Firefox

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

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

После разрешения предоставляется пользователем, я бы ожидать, чтобы консоль вошли

> "a" 
> "b" 

И действительно, это то, что произошло в Chrome. Однако на Firefox, по какой-то причине он только стреляет один раз и только журналы "b":

> "b" 

Что я могу поделать? Это ошибка?

+0

В хроме, вы должны иметь '«Ъ»' ', а затем«а»' – Rayon

+0

Мое предположение второе 'navigator.geolocation.getCurrentPosition 'также вызывается, и он отменяет начальное разрешение. Когда вы разрешаете второе приглашение, вы получаете '' b "' в консоли. Согласно документам, _Be знает, что каждый браузер имеет свои собственные политики и методы для запроса этого разрешения ._ [[Ref] (https://developer.mozilla.org/en-US/docs/Web/API/Navigator/geolocation)] – Rayon

+0

@RayonDabre Вы правы. '' b "' предшествует '' a ''. –

ответ

0

Я решил ее повторное использование обещание предыдущего запроса в:

// 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

Я считаю, что это происходит, потому что второй вызов выполняется до того, как пользователь принял разрешение на размещение для первого.

Однако, вы, вероятно, хотите посмотреть на

navigator.geolocation.watchPosition

, а не делать несколько запросов, чтобы получить позицию.

+0

Я не пытаюсь сделать несколько звонков, чтобы постоянно «обновлять» мои внутренние данные. Причина, по которой мой код вызывает несколько вызовов getCurrentPosition, заключается в том, что на странице есть разные модули, требующие геолокации, что приводит к нескольким вызовам 'getCurrentPosition'. –

+0

Если вам не требуется обновленное местоположение, просто вызовите getCurrentPosition один раз, а затем сохраните возвращаемое значение и используйте значение в другом месте. –

Смежные вопросы