Смущает пример кода геолокации W3C - будет ли цикл бесконечным, если позиция не может быть найдена? - PullRequest
3 голосов
/ 23 ноября 2011

Меня немного беспокоит безопасность этого примера кода в спецификации W3C Geolocation :

// Forcing the user agent to return a fresh cached position.

// Request a position. We only accept cached positions whose age is not
// greater than 10 minutes. If the user agent does not have a fresh
// enough cached position object, it will immediately invoke the error
// callback.
navigator.geolocation.getCurrentPosition(successCallback,
                                         errorCallback,
                                         {maximumAge:600000, timeout:0});

function successCallback(position) {
  // By using the 'maximumAge' option above, the position
  // object is guaranteed to be at most 10 minutes old.
  // By using a 'timeout' of 0 milliseconds, if there is
  // no suitable cached position available, the user agent 
  // will aynchronously invoke the error callback with code
  // TIMEOUT and will not initiate a new position
  // acquisition process.
}

function errorCallback(error) {
  switch(error.code) {
    case error.TIMEOUT:
      // Quick fallback when no suitable cached position exists.
      doFallback();
      // Acquire a new position object.
      navigator.geolocation.getCurrentPosition(successCallback, errorCallback);
      break;
    case ... // treat the other error cases.
  };
}

function doFallback() {
  // No fresh enough cached position available.
  // Fallback to a default position.
}

Что произойдет, если браузер по какой-либо причине не сможет вернуть исправление местоположения и не истечет время ожидания?

Конечно, код окажется в бесконечном цикле, и errorCallback будет вызываться снова и снова.

Я вижу вызов doFallback(), но это не остановит повторный вызов errorCallback. Или это будет?

Ответы [ 2 ]

3 голосов
/ 21 января 2013

error.code вернет POSITION_UNAVAILABLE.Код в спецификации представляет собой бесконечный цикл, потому что я думаю, это именно то, что они хотят.Представьте себе сценарий, в котором вы находитесь в режиме навигации, перемещаясь в пространстве.Иногда вы проходите через туннель, теряете сеть и не можете получить какую-либо позицию в течение определенного времени, которое вы не контролируете.Затем, когда вы выходите из туннеля, хорошо иметь возможность автоматически получить позицию.В сценарии, где требуется одноразовое значение, фрагмент кода не будет полезен, но его легко изменить, чтобы остановить с сообщением об ошибке.

0 голосов
/ 13 января 2012

Возможная ошибка: Google Chrome может не поддерживать Geolocation.

Попробуйте протестировать свою веб-страницу в нескольких браузерах и посмотрите, как это вам поможет.

...