сохранение XMLHttpRequest.responseText в переменной

Я пишу небольшой скрипт в JS для сохранения данных с помощью веб-сайта php следующим образом:

function getPopulation(id) { var xhr_object = null; if(window.XMLHttpRequest) // Firefox xhr_object = new XMLHttpRequest(); else if(window.ActiveXObject) // Internet Explorer xhr_object = new ActiveXObject("Microsoft.XMLHTTP"); else { // XMLHttpRequest non support? par le navigateur alert("Votre navigateur ne supporte pas les objets XMLHTTPRequest..."); return; } var url = "http://localhost/inf347/td-svg/population.php?id=1"; var res = 0; xhr_object.open("GET", url,true); xhr_object.send(null) ; xhr_object.onreadystatechange=function() { if (xhr_object.readyState==4) { //alert(xhr_object.responseText) ; res = xhr_object.responseText ; } } alert(res); //return -1; } 

Если я раскомментирую строку «//alert(xhr_object.responseText); то программа печатает правильный ответ. Но нет возможности сохранить это значение в переменной. Кто-нибудь знает, как обойти это?

Спасибо, сын

"оповещение (разрешение);" не будет работать, потому что браузер не ждет завершения вызова AJAX, он выполняет весь скрипт. Если вы хотите действовать по возвращенным данным, вам нужно добавить обратный вызов в вашу функцию xhr_object.onreadystatechange.

 if (xhr_object.readyState==4) { //alert(xhr_object.responseText) ; res = xhr_object.responseText ; act_on_response(res); } 

Где-то еще в коде:

 function act_on_response(res) { alert(res); } 

Вы должны указать имя функции … se ниже

  if (httpRequest.status == 200) responseData(httpRequest); else window.status = httpRequest.statusText; } } httpRequest.send(zallInOne); } function responseData(dataFromServer) { var d = new Date(); document.getElementById("sha1").style.color = "#ff6000"; document.getElementById("sha1").value = dataFromServer.responseText; ... ... } 

Если вы назначаете ответ на надлежащую глобальную переменную delcared или обновляете содержимое документа, он должен работать правильно.

Я думаю, проблема связана с последней линией оповещения.

 xhr_object.onreadystatechange=function() { if (xhr_object.readyState==4) { //alert(xhr_object.responseText) ; res = xhr_object.responseText ; } } alert(res); // THIS LINE 

Обратите внимание, что onreadystatechange – это функция обратного вызова, что означает, что эта функция будет вызываться при получении ответа. То есть, функция называется асинхронно. Таким образом, приложение будет продолжать выполняться, и ваше предупреждение может (будет) выполняться до получения ответа. Таким образом, вы получите предупреждение, в котором указано «0».

alert запускается до того, как responseText . Вы можете использовать функцию обратного вызова или перевести предупреждение в функцию statechange . Это связано с тем, что getPopulation запускает XMLHtpRequest , но сам по себе не ждет завершения этого и выполняет все, что находится в функции за один раз. Обработчик readystatechange прослушивает, в то время как триггер действует, но большую часть времени этот триггер возникает после выполнения функции вызова.

 // move alert up if (xhr_object.readyState==4) { res = xhr_object.responseText ; alert(res); } // use a callback if (xhr_object.readyState==4) { myCallback(xhr_object.responseText); } function myCallback(res){ alert(res); }