Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ssis/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
奇怪的javascript行为-同时有多个活动的XMLHttpRequest?长时间运行的脚本?_Javascript_Ajax - Fatal编程技术网

奇怪的javascript行为-同时有多个活动的XMLHttpRequest?长时间运行的脚本?

奇怪的javascript行为-同时有多个活动的XMLHttpRequest?长时间运行的脚本?,javascript,ajax,Javascript,Ajax,我试图发出两个并发AJAX请求 第一个调用/ajax_test1.php需要很长时间才能执行5秒左右。 第二个调用/ajax_test2.php的执行时间非常短 我看到的行为是I/ajax_test2.php返回,处理程序被调用为updatewo,其内容来自/ajax_test2.php 然后,5秒钟后,/ajax_test1.php返回,处理程序被调用为updateOne,其内容仍然来自/ajax_test2.php 为什么会这样 代码如下:此行:- req = new XMLHttpRequ

我试图发出两个并发AJAX请求

第一个调用/ajax_test1.php需要很长时间才能执行5秒左右。 第二个调用/ajax_test2.php的执行时间非常短

我看到的行为是I/ajax_test2.php返回,处理程序被调用为updatewo,其内容来自/ajax_test2.php

然后,5秒钟后,/ajax_test1.php返回,处理程序被调用为updateOne,其内容仍然来自/ajax_test2.php

为什么会这样

代码如下:

此行:-

req = new XMLHttpRequest();
应该是:-

var req = new XMLHttpRequest();
这一行:-

req = new XMLHttpRequest();
应该是:-

var req = new XMLHttpRequest();

正如AnthonyWJones所说,您的javascript正在声明第二个AJAX对象,该对象首先覆盖假定为全局的req变量,因为没有var,您也在覆盖AJAX变量

您应该将代码分开,即:

function doOnChange()
{
    var ajax1 = new AJAX('ajax_test1.php', 'one', updateOne);
    var ajax2 = new AJAX('ajax_test2.php', 'two', updateTwo);
}
function AJAX(url, action, handler)
{
    if (typeof XMLHttpRequest == "undefined")
    {
        XMLHttpRequest = function()
        {
            try { return new ActiveXObject("Msxml2.XMLHTTP.6.0") } catch(e) {}
            try { return new ActiveXObject("Msxml2.XMLHTTP.3.0") } catch(e) {}
            try { return new ActiveXObject("Msxml2.XMLHTTP") } catch(e) {}
            try { return new ActiveXObject("Microsoft.XMLHTTP") } catch(e) {}
            throw new Error( "This browser does not support XMLHttpRequest." )
        };
    }

    url = url + '?action=' + action + '&rand=' + Math.random()

    var req = new XMLHttpRequest();
        req.onreadystatechange = function() {
                if (req.readyState == 4)
                {
                    if (req.status == 200) 
                    {
                        alert('' + handler.name + '("' + req.responseText + '") ')
                        handler(req.responseText)
                    }
                }
            }

        req.open("GET", url, true);
        req.send(null);
}
问候


Gavin

正如AnthonyWJones所说,您的javascript正在声明第二个AJAX对象,该对象首先覆盖req变量,该变量假定为全局变量,因为没有变量,您也在覆盖AJAX变量

您应该将代码分开,即:

function doOnChange()
{
    var ajax1 = new AJAX('ajax_test1.php', 'one', updateOne);
    var ajax2 = new AJAX('ajax_test2.php', 'two', updateTwo);
}
function AJAX(url, action, handler)
{
    if (typeof XMLHttpRequest == "undefined")
    {
        XMLHttpRequest = function()
        {
            try { return new ActiveXObject("Msxml2.XMLHTTP.6.0") } catch(e) {}
            try { return new ActiveXObject("Msxml2.XMLHTTP.3.0") } catch(e) {}
            try { return new ActiveXObject("Msxml2.XMLHTTP") } catch(e) {}
            try { return new ActiveXObject("Microsoft.XMLHTTP") } catch(e) {}
            throw new Error( "This browser does not support XMLHttpRequest." )
        };
    }

    url = url + '?action=' + action + '&rand=' + Math.random()

    var req = new XMLHttpRequest();
        req.onreadystatechange = function() {
                if (req.readyState == 4)
                {
                    if (req.status == 200) 
                    {
                        alert('' + handler.name + '("' + req.responseText + '") ')
                        handler(req.responseText)
                    }
                }
            }

        req.open("GET", url, true);
        req.send(null);
}
问候


加文

迪奥德乌斯和迈克·罗宾逊:

你们没有完全阅读我的帖子。我知道其中一个页面的执行时间比另一个页面长。这是每个页面的预期行为

但是,如果您阅读了我的原始帖子,问题是两个页面的回调最终都只会被第一个页面的HTML内容调用

AnthonyWJones和Gavin:


谢谢大家!这很有魅力!我想我需要温习一下我的Javascript

迪奥德乌斯和迈克·罗宾逊:

你们没有完全阅读我的帖子。我知道其中一个页面的执行时间比另一个页面长。这是每个页面的预期行为

但是,如果您阅读了我的原始帖子,问题是两个页面的回调最终都只会被第一个页面的HTML内容调用

AnthonyWJones和Gavin:


谢谢大家!这很有魅力!我想我需要温习一下我的Javascript

没错。通过省略var,req是一个隐含的全局函数,并被第二个AJAX调用所覆盖。JavaScript最糟糕的设计特性并不是没有强大的竞争再次出现。@bobince-这与JS无关,与作者有关。同样的效果在C或任何给定的语言中都可以得到,有时这是必需的。JavaScript的错误在于将简单赋值默认为全局或最近的声明范围,这几乎总是不是您想要的,也不是其他语言所做的。对于一种有许多不理解作用域的幼稚作者的语言,这是一个危险的设计决策。@annakata:同样的错误不能在C中重复。问题是,如果在作用域链的其他地方找不到req标识符,javascript会在赋值过程中将其动态添加到全局上下文中。在C语言中,req标识符必须已经存在于不同的作用域中。通过省略var,req是一个隐含的全局函数,并被第二个AJAX调用所覆盖。JavaScript最糟糕的设计特性并不是没有强大的竞争再次出现。@bobince-这与JS无关,与作者有关。同样的效果在C或任何给定的语言中都可以得到,有时这是必需的。JavaScript的错误在于将简单赋值默认为全局或最近的声明范围,这几乎总是不是您想要的,也不是其他语言所做的。对于一种有许多不理解作用域的幼稚作者的语言,这是一个危险的设计决策。@annakata:同样的错误不能在C中重复。问题是,如果在作用域链的其他地方找不到req标识符,javascript会在赋值过程中将其动态添加到全局上下文中。在C语言中,req标识符必须已经存在于不同的作用域中。