Javascript Ajax сохранить результат onreadystatechange в глобальной переменной - PullRequest
1 голос
/ 18 марта 2012

Я пытаюсь написать скрипт для получения WOEID и интерфейса с API погоды Yahoo.Я создаю URL-адрес на основе значений широты и долготы из содержимого базы данных, которую я использую, и могу сделать это прекрасно.

Однако, когда дело доходит до сохранения этого URL-адреса в виде строки, которую я могуиспользовать в других функциях, у меня проблемы.После некоторого начального чтения кажется, что проблема связана с onreadystatechange и scope, но я никак не могу понять, как сохранить мою переменную.

Вот мой код:

 //<![CDATA[

var latitude = "";
var longitude = "";
var yahooAppID = "";
var yql = "";

//example yahoo request
//http://where.yahooapis.com/geocode?q=38.898717,+-77.035974&gflags=R&appid=SKUTk24k


function getLatLng() {
    var routeID = 5;
    var get = window.XMLHttpRequest ? new XMLHttpRequest() : new ActiveXObject('Microsoft.XMLHTTP');
    get.open('POST','process.php', true)
    get.setRequestHeader('Content-Type','application/x-www-form-urlencoded');
    get.send('command=fetch&rid='+routeID);
    get.onreadystatechange = function(){
        if(get.readyState==4 && get.status == 200) {
                os = eval('(' + get.responseText + ')');
                latitude = os.start.lat;
                longitude = os.start.lng;
                //var yql = 'select * from flickr.places where lat='+latitude+' and lon='+longitude;
                yql = "select * from flickr.places where lat=" +latitude+ " and lon="+longitude;
            }
            document.write(yql);
        }
        document.write(yql);
    }


function test() {
    getLatLng();
}
//]]>

Кажется, что первая document.write(yql); дает правильную строку, но вторая - нет, поэтому я знаю, что значение не застряло.

Заранее спасибо, если кто-нибудь может помочь.

1 Ответ

2 голосов
/ 18 марта 2012

Вы не смотрите на проблему с ограничением объема, а скорее на время. AJAX-запросы (по крайней мере, так, как вы его настроили) выполняются асинхронно, поэтому остальная часть вашего скрипта будет выполняться во время загрузки AJAX-запроса. Так что yql не будет обновляться до самого конца.

Кроме того, предупреждение: к моменту завершения запроса вы больше не сможете использовать document.write. Используйте alert() или манипуляцию DOM.

Жизненный цикл выглядит так:

  1. Скрипт выполняется нормально
  2. Анонимная функция связана с onreadystatechange
  3. readyState изменяется с «неотправлено» на «полученные заголовки» на «загрузка» на «выполнено». Ваша функция вызывается каждый раз, но вы устанавливаете yql только когда состояние готовности "выполнено".
  4. readyState завершено, и вы генерируете yql.

Итак, просто вызовите вашу функцию обработки изнутри if:

if(get.readyState==4 && get.status == 200) {
        os = get.responseXML;
        //find lat + lng
        yql = "select * from flickr.places where lat=" +latitude+ " and lon="+longitude;
        process(yql); //here!
}



function process(yql) {
   alert(yql);     //do something more useful eventually
}

jsFiddle

...