Я реализовал таймер для запроса геолокации HTML5 согласно этому сообщению Обратная связь геолокации при принятии запроса
Однако у меня возникла проблема, когда таймер вызывается независимо от того, является ли ответ navigator.geolocation.received истинным или нет. Возможно, я упускаю что-то очень очевидное, но я не вижу, что.
В основном, если я получаю информацию о географическом местоположении, я запускаю функцию geo_success_action()
, но в любом другом случае (ошибка географического местоположения, тайм-аут при получении общего местоположения или отсутствие поддержки html5 геолокации в браузер), я хочу запустить функцию geo_failure_action()
.
Однако происходит следующее: если собирается геолокация, вызывается моя функция geo_success_action()
, а затем, когда заканчивается таймер, также вызывается geo_failure_action()
.
Я предполагал, что в var успешно, установка navigator.geolocation.received = true
будет передана моей функции timedout
, и, следовательно, если navigator.geolocation.received
будет true, она не вызовет полученную функцию.
Есть мысли?
var succeed = function(obj) {
navigator.geolocation.received = true;
if (!navigator.geolocation.timedout) {
geo_success_action( obj, json_url );
}
};
var failed = function(obj) {
navigator.geolocation.received = true;
if (!navigator.geolocation.timedout) {
geo_failure_action( json_url );
} else {
geo_failure_action( json_url );
}
};
var timedout = function() {
navigator.geolocation.timedout = true; // could be used for other callbacks to trace if its timed out or not
if (!navigator.geolocation.received){
geo_failure_action( json_url );
//alert('Timed Out');
} else {
null;
}
}
// Extend geolocation object
if ( navigator.geolocation ) {
navigator.geolocation.retrievePermission = function retrievePermission(succeed,failed,options,timeout) {
this.received = false; // reference for timeout callback
this.timedout = false; // reference for other callbacks
this.getCurrentPosition.apply(this,arguments); // actual request
// Trigger timeout with its function; default timeout offset 5000ms
if ( timeout ) {
setTimeout(timeout.callback,timeout.offset || 5000);
}
}
// New location request with timeout callback
navigator.geolocation.retrievePermission(succeed,failed,{},{
offset: 6000, // miliseconds
callback: timedout
});
// If geo-location not supported at all, do failure action
} else {
geo_failure_action( json_url );
}