JavaScript, присваивающий возвращаемое значение функции обратного вызова глобальной переменной - PullRequest
14 голосов
/ 25 августа 2011

Мой вопрос касается Javascript. У меня есть функция обратного вызова, которая получает объект Position при успешном обратном вызове.

Проблема в том, что когда я пытаюсь установить свойства объекта Position для глобальной переменной при успешном обратном вызове, он просто не позволяет мне это сделать, а глобальный просто остается неопределенным.

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

Вот упрощенный код.

var x;

navigator.geolocation.getCurrentPosition(onSuccess, onError);

//on Successful callback receives a Position Object
function onSuccess(position) {  
  var coords = position.coords;  
    x=coords;       // Setting directly to an object does not work x still remains undefined after succesful callback               
return coord; // Trying to set this to a global object 

}

// onError Callback receives a PositionError object
//
function onError(error) {
    alert('code: '    + error.code    + '\n' +
          'message: ' + error.message + '\n');
}

Ответы [ 5 ]

15 голосов
/ 25 августа 2011

Вы не можете вернуть значение из обратного вызова (в этом случае).Это будет означать, что внутри getCurrentPosition возвращаемое значение из обратного вызова должно быть где-то назначено.

Назначение его глобальной переменной работает, но во время обращения к этой переменной ему не было присвоеноНовое значение еще.Например,

// x is assigned in `onSuccess`
var x;
navigator.geolocation.getCurrentPosition(onSuccess, onError);
alert(x); // will be undefined, the response is not processed yet

Подумайте об этом: getCurrentPosition, вероятно, выполняет запрос Ajax для получения позиции.Такой запрос занимает (а) время (пару миллисекунд) и из-за этого (b) асинхронный , что означает, что JavaScript не ожидает до получения ответа.Ваш код намного быстрее .onSuccess еще не был вызван, когда вы предупреждаете x.

Единственное решение:

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

1 голос
/ 25 августа 2011

Как описано Феликсом Кингом, вы не можете вернуть значение из обратного вызова, и в вашем варианте глобальной переменной переменная не будет установлена ​​до тех пор, пока запрос AJAX не завершит и не вызовет обратный вызов (отсюда и его имя!).

Используя глобальную переменную, вы можете решить свою проблему, если у вас есть какой-то цикл обработки, вы можете добавить этот код в этот цикл, чтобы делать то, что требуется при изменении координаты.

  if (coord) // global variable has a new value
    // process it
     alert('code: '    + error.code    + '\n' +
          'message: ' + error.message + '\n');
    // then clear it
    coord = null;
  } 
0 голосов
/ 18 сентября 2014

Вы можете реализовать вспомогательный метод, такой как текущий:

var LocationHelper = function() {};

LocationHelper.prototype.getLocation = function(callback) {

    navigator.geolocation.getCurrentPosition(onSuccess, onError);

    function onSuccess(pos) {
        callback({
            pos: pos
        });
    }

    function onError(message) {
        callback({
            message: message
        });
    }

  };
0 голосов
/ 25 августа 2011

поставить console.log(x); сразу после x=cords, чтобы проверить значение (работает в Chrome и FF с FireBug)

сделать это также сразу после вызова OnSuccess.

Также не забывайте, что в JS есть асинхронный код (если вы используете AJAX для получения позиции), возможно, вы просто не получите ответ при проверке значения x

0 голосов
/ 25 августа 2011

вы пробовали установить его через глобальный window объект?

//on Successful callback receives a Position Object
function onSuccess(position) {  
  var coords = position.coords;  
    window.x=coords;       // Setting directly to an object does not work x still remains undefined after succesful callback               
return coord; // Trying to set this to a global object 

}

также, поскольку вы возвращаете координаты из обработчика успеха, нет ли другого способа получить это значение?

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