for循环中的Javascript XMLHttpRequest

时间:2016-12-13 15:22:27

标签: javascript xmlhttprequest

我之前已经问过这个问题,但是我尝试应用答案而没有结果。

我正在尝试使用for循环在同一个域上执行多个请求,但它仅适用于我的数组的最后一个记录。当我尝试只有一个请求它工作正常。我不明白。

以下是我使用的代码:

var xhr = new XMLHttpRequest();
var idArray = ['1', '2', '3', '4', '5'];

for(var i = 0;i < idArray.length;i++) {
    xhr.open('PUT', 'https://www.domain.com/url/' + idArray[i]);
    xhr.setRequestHeader('Authorization', authorizationToken);
    xhr.send(null);
    var test = setInterval(function () {
        if(xhr.readyState != 4) {
            //someCode
        } else {
            clearInterval(test);
        }
    }, 1000);
    xhr.onreadystatechange = function () {
        if (xhr.readyState == 4) {
            if(xhr.status != 200) {
                //someCode
            }
        }
    }
}

我也试过了,但仍然没有结果:

var xhr = new XMLHttpRequest();
var idArray = ['1', '2', '3', '4', '5'];

for(var i = 0;i < idArray.length;i++) {
    (function(i) {
        xhr.open('PUT', 'https://www.domain.com/url/' + idArray[i]);
        xhr.setRequestHeader('Authorization', authorizationToken);
        xhr.send(null);
        var test = setInterval(function () {
            if(xhr.readyState != 4) {
                //someCode
            } else {
                clearInterval(test);
            }
        }, 1000);
        xhr.onreadystatechange = function () {
            if (xhr.readyState == 4) {
                if(xhr.status != 200) {
                    //someCode
                }
            }
        }
    })(i);
}

我没看到我做错了什么。

1 个答案:

答案 0 :(得分:0)

您的第二次尝试相当接近,但您需要为IIFE内的每个请求创建一个单独的 XMLHttpRequest对象,请参阅重新定位的行***评论:

var idArray = ['1', '2', '3', '4', '5'];

for(var i = 0;i < idArray.length;i++) {
    (function(i) {
        var xhr = new XMLHttpRequest(); // ***
        xhr.open('PUT', 'https://www.domain.com/url/' + idArray[i]);
        xhr.setRequestHeader('Authorization', authorizationToken);
        xhr.send(null);
        var test = setInterval(function () {
            if(xhr.readyState != 4) {
                //someCode
            } else {
                clearInterval(test);
            }
        }, 1000);
        xhr.onreadystatechange = function () {
            if (xhr.readyState == 4) {
                if(xhr.status != 200) {
                    //someCode
                }
            }
        }
    })(i);
}

从技术上讲,既然你没有在你在那里创建的回调中使用i,那么你就不需要传递i并将其作为IIFE的参数(但你确实需要IIFE,以便你有单独的xhr)。

附注:不确定区间计时器的用途是什么,所以我已将其留下,但您的onreadystatechange处理程序将被调用,无需备份用计时器。