Проблема с запуском обратного вызова геолокации вне зависимости от того, получен ответ или нет - PullRequest
1 голос
/ 16 марта 2012

Я реализовал таймер для запроса геолокации 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 );
}

1 Ответ

0 голосов
/ 16 марта 2012

Я не проверял, но это должно работать

var timedout = function() {
    navigator.geolocation.timedout = true; 

    if( navigator.geolocation.received === undefined ) {
        navigator.geolocation.received = true;
    }

    if (!navigator.geolocation.received){
        geo_failure_action( json_url );
        //alert('Timed Out');
    } else {
        null;
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...