Передача переменной из функции обратного вызова в другую функцию?

0

Я работаю над созданием сценария GeoLocation HTML5, и я хотел бы сохранить zip-код в cookie, но пока я просто пытаюсь выяснить, как передать переменную zip-кода в другую функцию.

Вот мой сценарий для изменения геокода на основе lat/long:

function retrieve_zip(callback)
{
    try { if(!google) { google = 0; } } catch(err) { google = 0; } // Stupid Exceptions
    if(navigator.geolocation) // FireFox/HTML5 GeoLocation
    {
        navigator.geolocation.getCurrentPosition(function(position)
        {
            zip_from_latlng(position.coords.latitude,position.coords.longitude,callback);
        });
    }
    else if(google && google.gears) // Google Gears GeoLocation
    {
        var geloc = google.gears.factory.create('beta.geolocation');
        geloc.getPermission();
        geloc.getCurrentPosition(function(position)
        {
            zip_from_latlng(position.latitude,position.longitude,callback);
        },function(err){});
    }
}
function zip_from_latlng(latitude,longitude,callback)
{
    // Setup the Script using Geonames.org WebService
        var script = document.createElement("script");
        script.src = "http://ws.geonames.org/findNearbyPostalCodesJSON?lat=" + latitude + "&lng=" + longitude + "&callback=" + callback;
        console.log(script.src);
    // Run the Script
        document.getElementsByTagName("head")[0].appendChild(script);
}
function callback(json)
{
    zip = json.postalCodes[0].postalCode;
    country = json.postalCodes[0].countryCode;
    state = json.postalCodes[0].adminName1;
    county = json.postalCodes[0].adminName2;
    place = json.postalCodes[0].placeName;
    alert(zip);
}
$('#findLocation').click(function(event) {
    event.preventDefault();
    console.log(zip); // This is giving me undefined currently
});

В принципе, в функции обратного вызова я хочу сохранить zip-код как переменную (а не отображать ее в предупреждении), а затем в нижней части on click, я хочу иметь возможность отображать почтовый индекс, который был сохраненный в предыдущей функции обратного вызова.

Любая помощь очень ценится, все еще довольно новая для Javscript/jQuery, спасибо!

Теги:
function
variables

3 ответа

1
Лучший ответ

Вы можете установить zip как глобальную переменную, включив ее вне функции в верхней части документа, например:

var zip;
...

Кроме того, вы можете рассмотреть возможность определения объекта на глобальном уровне и использования его в качестве пространства имен для хранения таких переменных:

window.address = {};

function callback(json){
    address.zip = json.postalCodes[0].postalCode;
    address.country = json.postalCodes[0].countryCode;
    address.state = json.postalCodes[0].adminName1;
    address.county = json.postalCodes[0].adminName2;
    address.place = json.postalCodes[0].placeName;
}

$('#findLocation').click(function(event) {
    event.preventDefault();

    console.log(address.address);
    console.log(address.zip);
    ...
});

Надеюсь, это поможет!

  • 0
    Спасибо, ваше альтернативное решение работает отлично. Я ценю это! Примут через 2 мин.
  • 0
    @ user13286 Нет проблем, рад, что смог помочь!
1

Определите var zip при очень начале кода. Вы не определили его.

Я не пробовал, но он должен решить вашу проблему.


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

  • 0
    Спасибо, простое исправление :)
  • 0
    Пожалуйста :)
0

То, что я сделал бы, заключается в том, чтобы избежать анонимной функции в обработчике событий, то есть создать новую именованную функцию -which, дает вам дополнительное преимущество отслеживания во время debugging-, а затем использовать эту функцию в качестве обратного вызова обработчика события:

function eventHandlerFunction(event) {
  var zip;
  event.preventDefault();

  zip = eventHandlerFunction.zip;
  console.log(zip);
}

function callback(json) {
  var zip;
  zip = doSomethingWithJsonToGetTheZip();
  eventHandlerFunction.zip = zip;
}

$("#findLocation").click(eventHandlerFunction);

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

   var yourModule = (function($) {
      var zip;

      function retrieveZip(callback) {
        // your code
      }

      function callback(json) {
        // do something with json
        zip = json.zip; // or whatever
      }

      $("#findLocation").click(function(event) {
         event.preventDefault();
         console.log(zip);  // zip is visible in the parent scope + this scope
      });
   }(jQuery));

Ещё вопросы

Сообщество Overcoder
Наверх
Меню