为什么XMLHttpRequest.abort会阻止除循环内部的第一个调用之外的所有Ajax调用

Why does XMLHttpRequest.abort prevent all Ajax calls except the first inside of a loop

本文关键字:调用 第一个 Ajax 内部 abort XMLHttpRequest 循环 为什么      更新时间:2023-09-26

我正在通过发送伪造的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] );
相关文章: