Я пишу небольшой скрипт в 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); }