JavaScript использует ответ от функции в вызывающей функции

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

    var address = userUpdates.address + " " + userUpdates.city + ", " + userUpdates.state + " " + userUpdates.zip;

   geocoder.geocode(address)
        .then(function(res) {
              console.log(res);
        })
        .catch(function(err) {
             console.log(err);
       });

console.log создает правильный JSON

[ 
  { 
    latitude: 35,
    longitude: -78.5,
    country: 'United States',
    city: 'Clayton',
    state: 'North Carolina',
    stateCode: 'NC',
    zipcode: '27520',
    streetName: 'Main St',
    streetNumber: '100',
    countryCode: 'US' 
   }
 ]

но я не могу назначить res чему-либо, что будет сохраняться вне функции geocoder.geocode


person Chris The DBA    schedule 26.06.2014    source источник


Ответы (3)


Пробовали ли вы создать глобальную переменную вне функции geocoder.geocode для хранения значения?

   var globalRes = null;
   geocoder.geocode(address)
        .then(function(res) {
              globalRes = res;
              console.log(res);
        })
        .catch(function(err) {
             console.log(err);
       });
person primehalo    schedule 26.06.2014
comment
Я так и сделал, и переменная имеет значение null, когда я вызываю ее вне функции геокодирования. - person Chris The DBA; 27.06.2014
comment
Хм... вы уверены, что вызываете переменную globalRes после завершения работы функции geocoder.geocode(), а не до ее завершения? - person primehalo; 27.06.2014
comment
Я скопировал ваш код напрямую и добавил отправку console.log вне функции .then. Он возвращает NULL - person Chris The DBA; 27.06.2014
comment
Функция геокодирования является асинхронной, поэтому даже если globalRes используется после функции геокодирования, это не означает, что функция геокодирования фактически завершена. Попробуйте использовать setInterval(), чтобы проверить значение globalRes и посмотреть, изменится ли значение через несколько секунд. Что-то вроде: var intervalId = 0; function isDone() { if (globalRes) { clearInterval(intervalId); alert('We have it!') } } intervalId = setInterval(isDone, 1000); - person primehalo; 27.06.2014
comment
Спасибо. Думаю, теперь я понял. Запустите обновление/сохранение внутри функции isDone, заменив предупреждение, похоже, работает. - person Chris The DBA; 27.06.2014

Я думаю, вы должны быть в состоянии сделать что-то вроде этого: -

var response = null;
geocoder.geocode(address)
    .then(function(res) {
          response = res;
          console.log(res);
    })
person Mritunjay    schedule 26.06.2014

Добро пожаловать в мир обратных вызовов.

Вот упрощенный пример кода, который поможет вам начать работу.

function myBigFunction() {
  // Here is part 1:
  console.log("I am part 1");

  // Now, call something async and wait for the callback
  myAsyncFunction(function (result) {
    console.log("I am part 2, with the results from myAyncFunction");
  });

  function myAsyncFunction(callback) {
    var returnValue = "This is returned";

    window.setTimeout(function () {
      // Call the callback and make myBigFunction pick back up.
      callback(returnValue);
    }, 250);

  }

}
myBigFunction();

Итак, в вашем примере вам нужно что-то вроде:

function doGeoCoder(callback) {
   geocoder.geocode(address)
        .then(function(res) {
              callback(res);
              console.log(res);
        })
        .catch(function(err) {
             console.log(err);
       });
}

doGeoCoder(function(res) {
  console.log("I'm in the calling function's callback with");
  console.log(res);
});
person Jeremy J Starcher    schedule 26.06.2014
comment
Как указать разрешение в console.log(res) вне функции doGeoCoder? Он содержит объект JSON с широтой и долготой. Я хотел бы добавить их в пользовательское обновление и сохранить в базе данных. - person Chris The DBA; 27.06.2014