奇怪的javascript行为-同时有多个活动的XMLHttpRequest?长时间运行的脚本?
我试图发出两个并发AJAX请求 第一个调用/ajax_test1.php需要很长时间才能执行5秒左右。 第二个调用/ajax_test2.php的执行时间非常短 我看到的行为是I/ajax_test2.php返回,处理程序被调用为updatewo,其内容来自/ajax_test2.php 然后,5秒钟后,/ajax_test1.php返回,处理程序被调用为updateOne,其内容仍然来自/ajax_test2.php 为什么会这样 代码如下:此行:-奇怪的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
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标识符必须已经存在于不同的作用域中。