onreadystatechange в цикле, readystate изменяется слишком поздно - PullRequest
0 голосов
/ 30 ноября 2010

Я в цикле выдаю восемь xmlhttprequests на картографический сервер Google и обрабатываю объекты json, которые сервер возвращает для получения почтовых индексов. Код работает нормально, если xmlhttprequests являются синхронными. Поскольку я должен использовать асинхронные запросы, я пытаюсь преобразовать код в асинхронный. Не работает

Я использую два оповещения для мониторинга myZip. Когда код запускается, второе предупреждение, прямо над возвратом, запускается восемь раз и показывает myZip как ноль или неопределенный, и это то, что возвращается. Затем первое оповещение запускается восемь раз и дает нужный почтовый индекс, к сожалению, слишком поздно. Мне кажется, состояние готовности не меняется, пока не станет слишком поздно.

Как мне изменить код, чтобы он возвращал почтовый индекс, а не ноль? Любая помощь будет принята с благодарностью.

var url = "http://maps.googleapis.com/maps/api/geocode/json?address="+address+city+state+"&sensor=false";

req.open("GET", url,true);

var myZip;

req.onreadystatechange = function()
{ 
        if(req.readyState == 4 && req.status == 200) {
        (function(data){
            var myObj = eval( '(' + data + ')' );
            if(myObj.status=="OK"){    
                  for(i=0; i <myObj.results[0].address_components.length; i++){
                  if(myObj.results[0].address_components[i].types=="postal_code"){
                  myZip=myObj.results[0].address_components[i].long_name;
                  alert('zip is '+myZip);
                  }
               }
            }    
            else    
            {
            alert("Error: returned status code "+req.status+" "+req.statusText);
            }
        })(req.responseText);
    }
}
req.send();
alert(myZip);
return myZip;

Ответы [ 2 ]

1 голос
/ 04 декабря 2010

Вы должны либо использовать обратный вызов вместо оператора return, либо вы должны запустить его как стратифицированный JavaScript: http://stratifiedjs.org. Затем вы можете написать его синхронно, как вы это сделали, даже если это НЕ будетзаблокировать браузер.

0 голосов
/ 30 ноября 2010

Полагаю, вы используете один и тот же объект (req) пару раз и будете перезаписываться в каждом цикле.

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

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

...