Javascript назначение возвращаемого значения функции обратного вызова глобальной переменной

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

проблема в том, что когда я пытаюсь установить свойства объекта 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 ответов


вы не можете вернуть значение из функции обратного вызова (в данном случае). Это означало бы, что внутри 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.

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

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


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

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

  if (coord) // global variable has a new value
    // process it
     alert('code: '    + error.code    + '\n' +
          'message: ' + error.message + '\n');
    // then clear it
    coord = null;
  } 

вы пытались установить его через global


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

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

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


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

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
        });
    }

  };