将XMLHttpRequest.responseText保存在变量中

saving XMLHttpRequest.responseText in a variable

本文关键字:变量 存在 保存 XMLHttpRequest responseText      更新时间:2023-09-26

我正在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);",则程序将打印正确的答案。但是没有办法将该值保存到变量中。有人知道如何避开它吗?

谢谢,子

"alert(res);"将不起作用,因为浏览器不等待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;
   ...
  ...
 }

如果将响应分配给一个适当的delcare全局变量,或者更新文档的内容,它应该可以正常工作。

我想问题出在最后一条警戒线上。

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

请注意,onreadystatechange是一个回调函数,这意味着在收到响应时将调用此函数。也就是说,该函数是异步调用的。因此,应用程序将继续执行,并且您的警报可以(将)在收到响应之前执行。因此,您将收到一个显示为"0"的警报。

alertresponseText到达之前被触发。您可以使用回调函数,也可以将警报上移到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);
}