为什么XMLHttpRequest.abort会阻止除循环内部的第一个调用之外的所有Ajax调用
Why does XMLHttpRequest.abort prevent all Ajax calls except the first inside of a loop
我正在通过发送伪造的Ajax请求来修改Javascript中的线程处理。然而,我对下面代码的行为感到惊讶。
当xhr.abort()被注释掉时,"quarter"answers"half"都会像我所期望的那样穿插在控制台中。但如果调用xhr.abort(),则只有"quarter"被发送到控制台,而不是"half"。
任何了解XMLHttpRequest的中止方法的工作原理或情况的人都将不胜感激。我在https://developer.mozilla.org/en/DOM/XMLHttpRequest它说"abort()……如果请求已经发送,就中止。"键是的*单数*请求,而不是所有其他请求,就好像XMLHttpRequest是一个singleton一样。
function parallelize(bogusUrl, parallelFns) {
for (var i=0, n=parallelFns.length; i<n; i++) {
var fn = parallelFns[i]
,xhr;
try {xhr = new XMLHttpRequest()}
catch (e) {xhr = new ActiveXObject('Microsoft.XMLHTTP')}
xhr.onreadystatechange = function() {
if (xhr.readyState == 1) {
fn();
//xhr.abort();
}
};
xhr.open('GET', bogusUrl);
xhr.send(null);
}
}
parallelize('bogusUrl', [
function(){setInterval(function(){console.log('quarter')}, 250)},
function(){setInterval(function(){console.log('half')}, 500)}
]);
块不会在JavaScript中创建作用域;因此,循环的每一次迭代都共享同一个"xhr"变量,其值在每次迭代中都会被覆盖。
为了解决这个问题,您可以创建一个单独的函数来完成xhr工作:
function doXHR(fn) {
var xhr = null;
try {xhr = new XMLHttpRequest()}
catch (e) {xhr = new ActiveXObject('Microsoft.XMLHTTP')}
xhr.onreadystatechange = function() {
if (xhr.readyState == 1) {
fn();
//xhr.abort();
}
};
xhr.open('GET', bogusUrl);
xhr.send(null);
}
然后你的循环会是这样的:
for (var i=0, n=parallelFns.length; i<n; i++)
doXHR( parallelFns[i] );
相关文章:
- 而循环只设置php中输入字段中的第一个值
- 如何在JQuery函数中定义一个值,然后调用另一个函数并使用该值
- 多次调用另一个javascript函数中的javascript函数
- 在输入字段上有两个函数调用,一个在Blur上,一个不在Angular中
- 错误:$injector:modulerr模块错误(我的第一个SPA应用程序)
- IE11中的第二个调用取消了第一个Fetch API调用
- 如何在调用下一个请求之前完成第一个Ajax Get请求
- 如何通过连接多个异步javascript调用,从对象数组中排序并获取第一个obejct
- 在ajax html返回中调用ajax会阻止第一个ajax脚本进一步工作
- 如何在第一个 php 脚本中访问变量 'a' 的值到第二个 php 脚本,并通过 ajax 调用链接
- 如何在angularjs中使用第一个api的结果,进入第二个api调用
- 第一个javascript函数调用从未执行
- 为什么当调用一个函数时,第一个this是父对象,但在随后的函数调用中,this是指窗口对象
- 如何调用$http在angularJS顺序?但是我需要根据第一个$http的响应调用它第二个$http
- 第一个next()调用的参数所在的位置
- 不是所有的链接都触发AJAX调用,只有第一个在Python Flask Application中触发AJAX调用
- 如果第一个ajax请求在第一个调用获得响应之前再次被调用,如何停止第一个ajax请求
- 第一个ajax调用没有'不起作用
- 如何在第一个 getjson 函数中的另一个 getjson 调用中使用 getjson 响应变量
- 在第一个ajax调用终止之前停止第二个ajax调用