嗨,我尝试使用不同的参数多次访问一种资源

在这种情况下

    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报告已收到两个请求,并且可以在资源窗格中查看它们。

另外,如果我使请求同步,那么它可以正常工作。 但是,这对于发布代码是不可接受的,因为请求可能会超时。

谢谢

#1楼 票数:8 已采纳

使用var定义http_request 当前,您正在将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 ,该变量将在全局( window )范围内定义。 如果在变量之前使用var ,则该变量在本地范围内定义(在这种情况下,在function request中)。

#2楼 票数:0

实际上,可以运行多个异步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对象,并定义一个值xhrarray['xhr_'+item.mkdcck].uniqueid以获取其唯一ID,并将其结果加载到所需的位置。

希望将来对您有帮助。

  ask by 111111 translate from so

未解决问题?本站智能推荐:

1回复

香草JavaScript异步多个xhr.open()

我想知道如何使用香草JS处理多个xhr请求。 我想打开多个HTML模板,并在所有模板都准备好后加载页面。 当我使用几个xhr.open()请求时,它将仅返回1个模板: 我明白.open()只在工作1 时间 。 那么是否可以异步加载所有团队模板,或者我应该在同步问题中一个接一个地加载
1回复

XMLHttpRequest onprogress不触发异步= false

发送async = false的XMLHttpRequest时,永远不会在上传文件时触发xhr.upload.onprogress事件。 资源: 我已经在Firefox和Chrome中对此进行了测试。 我不知道是否错过了一些文档,但是找不到任何表明async = false时
1回复

AngularJS-异步调用后模型未更新

我想知道是否有人可以帮助我? 我对angular还是很陌生,并遇到一个问题,即我的选择控件最初没有选择正确的值,而是在后续更改时进行更新。 我的HTML如下: 我正在通过WebApi加载一个对象,该对象表示一个工作和当前的查找值-目前尚不在服务中,因为它目前正在进行所有测试,但j
2回复

快速发送时不接收异步AJAX请求

我的脚本正在将GET请求发送到页面( http://example.org/getlisting/ ),然后页面反过来以JSON对象作为响应。 ( {"success":true, "listingid":"123456"} ) 这是一个示例片段: 很简单。 该脚本也可以完美运
2回复

async:false已弃用,前进的简单方法是什么?

浏览器根据Synchronous XMLHttpRequest的whatwg规范发出警告。 从警告中,弃用的原因很明显“用户体验” 我的问题是: 什么是对此的简单替换? 他们是否可以不更新JS,以致它不会停止浏览器中的所有其他JS代码,而只会停止正在运行的线程中的JS代码?
1回复

如何正确链接包装在Promise中的不同异步操作

目前,我对promise的理解仅仅是对外部环境(浏览器,node.js等)本地的异步函数的包装。 我对如何实际编写使用Promise将异步操作正确连接在一起的软件感到困惑。 这是我的问题: 在下面的代码中, setTimeout函数包装在promise中。 我也将XMLHttpReq
1回复

Javascript同步加载表文件

我知道此实现用于调用本地文本文件。 我的问题是,我不希望它异步读取文件。 相反,我希望函数读取文件并将输出作为字符串变量返回。 我的文件格式如下: 输出将存储在obj其中包含以下字段 这些字段必须从文本文件的第一行获得。 一切都是从本地主机完成的,没有什么是远程的
2回复

JavaScript执行代码顺序

我正在用JavaScript迈出第一步,并试图理解它的工作原理。 我遇到了代码执行顺序的问题。 问题是“作业完成”比“文件打开”首先出现。 但是该文件具有“作业完成”警报之后的代码所必需的信息。 我更改了“ get”请求的异步部分,但是没有用。 打开文件并检索信息时,我该