Javascript:XHR不处理多个异步请求
嗨,我正在尝试使用不同的参数多次访问一个资源 在这种情况下,请求Javascript:XHR不处理多个异步请求,javascript,ajax,asynchronous,xmlhttprequest,Javascript,Ajax,Asynchronous,Xmlhttprequest,嗨,我正在尝试使用不同的参数多次访问一个资源 在这种情况下,请求 var domains = [ 'host1', 'host2' ]; var requests = new Array(); for ( i in domains ) { requests[i]=new request(domains[i]); } function request(site) { var url
var domains = [
'host1',
'host2'
];
var requests = new Array();
for ( i in domains )
{
requests[i]=new request(domains[i]);
}
function request(site)
{
var url = 'get_remote_status.php?host='+site;
var queues = {};
http_request = new XMLHttpRequest();
http_request.open("GET", url, true, 'username', 'password');
http_request.onreadystatechange = function () {
var done = 4, ok = 200;
if (http_request.readyState == done && http_request.status == ok) {
queues = JSON.parse(http_request.responseText);
var queuesDiv = document.getElementById('queues');
print_queues(queues, queuesDiv, site);
}
};
http_request.send(null);
}
但是,代码lambda只处理其中一个请求。Chromium报告两个请求都已收到,可在资源窗格中查看
另外,如果我使请求同步,那么它可以正常工作。但是,这对于发布代码来说是不可接受的,因为请求可能会超时
感谢使用var定义http_请求。目前,您正在将XHR对象分配给一个全局变量。因此,您的脚本一次只能处理一个XHR
相关错误代码:
function request(site)
{
var url = 'get_remote_status.php?host='+site;
var queues = {};
http_request = new XMLHttpRequest();
拟议更改:
function request(site)
{
var url = 'get_remote_status.php?host='+site;
var queues = {};
var http_request = new XMLHttpRequest(); //VAR VAR VAR !!!
当您在变量之前省略var时,该变量将在全局窗口范围中定义。如果在变量之前使用var,则在函数请求的本地范围内定义变量。在本例中,使用var定义http\U请求。当前,将XHR对象分配给全局变量。因此,您的脚本一次只能处理一个XHR
相关错误代码:
function request(site)
{
var url = 'get_remote_status.php?host='+site;
var queues = {};
http_request = new XMLHttpRequest();
拟议更改:
function request(site)
{
var url = 'get_remote_status.php?host='+site;
var queues = {};
var http_request = new XMLHttpRequest(); //VAR VAR VAR !!!
当您在变量之前省略var时,该变量将在全局窗口范围中定义。如果在变量之前使用var,则该变量在函数请求的本地范围内定义。事实上,可以运行多个异步xhr调用,但必须给它们一个唯一的id作为参数,以便能够在DOM中本地存储和加载它们 例如,您希望在数组上循环并对每个对象进行ajax调用。这有点棘手,但这段代码对我来说很有用
var xhrarray={};
for (var j=0; j<itemsvals.length; j++){
var labelval=itemsvals[j];
// call ajax list if present.
if(typeof labelval.mkdajaxlink != 'undefined'){
var divlabelvalue = '<div id="' + labelval.mkdid + '_' + item.mkdcck + '" class="mkditemvalue col-xs-12 ' + labelval.mkdclass + '"><div class="mkdlabel">' + labelval.mkdlabel + ' :</div><div id="'+ j +'_link_'+ labelval.mkdid +'" class="mkdvalue">'+labelval.mkdvalue+'</div></div>';
mkdwrapper.find('#' + item.mkdcck + ' .mkdinstadivbody').append(divlabelvalue);
xhrarray['xhr_'+item.mkdcck] = new XMLHttpRequest();
xhrarray['xhr_'+item.mkdcck].uniqueid=''+ j +'_link_'+ labelval.mkdid +'';
console.log(xhrarray['xhr_'+item.mkdcck].uniqueid);
xhrarray['xhr_'+item.mkdcck].open('POST', labelval.mkdajaxlink);
xhrarray['xhr_'+item.mkdcck].send();
console.log('data sent');
xhrarray['xhr_'+item.mkdcck].onreadystatechange=function() {
if (this.readyState == 4) {
console.log(''+this.uniqueid);
document.getElementById(''+this.uniqueid).innerHTML = this.responseText;
}
};
}
}
您必须在一个全局变量对象中设置每个xhr对象,并定义一个值XHRARAY['xhr\UUX'+item.mkdcck].uniqueid
获取其唯一id并将其结果加载到所需的位置
希望这将在将来对您有所帮助。事实上,可以运行多个异步xhr调用,但您必须给它们一个唯一的id作为参数,以便能够在DOM中本地存储和加载它们 例如,您希望在数组上循环并对每个对象进行ajax调用。这有点棘手,但这段代码对我来说很有用
var xhrarray={};
for (var j=0; j<itemsvals.length; j++){
var labelval=itemsvals[j];
// call ajax list if present.
if(typeof labelval.mkdajaxlink != 'undefined'){
var divlabelvalue = '<div id="' + labelval.mkdid + '_' + item.mkdcck + '" class="mkditemvalue col-xs-12 ' + labelval.mkdclass + '"><div class="mkdlabel">' + labelval.mkdlabel + ' :</div><div id="'+ j +'_link_'+ labelval.mkdid +'" class="mkdvalue">'+labelval.mkdvalue+'</div></div>';
mkdwrapper.find('#' + item.mkdcck + ' .mkdinstadivbody').append(divlabelvalue);
xhrarray['xhr_'+item.mkdcck] = new XMLHttpRequest();
xhrarray['xhr_'+item.mkdcck].uniqueid=''+ j +'_link_'+ labelval.mkdid +'';
console.log(xhrarray['xhr_'+item.mkdcck].uniqueid);
xhrarray['xhr_'+item.mkdcck].open('POST', labelval.mkdajaxlink);
xhrarray['xhr_'+item.mkdcck].send();
console.log('data sent');
xhrarray['xhr_'+item.mkdcck].onreadystatechange=function() {
if (this.readyState == 4) {
console.log(''+this.uniqueid);
document.getElementById(''+this.uniqueid).innerHTML = this.responseText;
}
};
}
}
您必须在一个全局变量对象中设置每个xhr对象,并定义一个值XHRARAY['xhr\UUX'+item.mkdcck].uniqueid
获取其唯一id并将其结果加载到所需的位置
希望这能对你以后有所帮助。谢谢,你能告诉我我不是JS人。我更喜欢使用“严格使用”;谢谢,你能告诉我我不是一个JS的家伙。喜欢总是使用'严格使用';