javascript - 在一个循环中连接 XMLHTTPRequest 响应以记录所有循环何时完成

标签 javascript

json.orderItem.length == 2 , 所以 2 HTTP请求被触发。
如果我一个接一个地触发这 2 个请求(不是在循环中),我会收到这 2 个单独的响应:

1 'productName1, partNumber2342'

2 'productName2, partNumber8789'

我想在它们返回时连接这些响应,这样,在某些时候,我可以将所有响应记录为一个字符串。
我怎样才能做到这一点?

目前我无法确定是否所有请求都已完成并因此记录最后的 String .

包裹在循环中的请求..

var f = (function(){
    var xhr = [];
    var test = '';
    for (i = 0; i < json.orderItem.length; i++){
        (function (i){
            xhr[i] = new XMLHttpRequest();
            url = '/products/byId/' + json.orderItem[i].productId;
            xhr[i].open("GET", url, true);
            xhr[i].onreadystatechange = function () {
                if (xhr[i].readyState == 4 && xhr[i].status == 200) {
                    test += JSON.parse(xhr[i].responseText).entry[0].name + ', ' + JSON.parse(xhr[i].responseText).entry[0].partNumber;
                }
            };
            xhr[i].send();
        })(i);
    }
})();

最佳答案

使用 javascript 闭包:

Closures are functions that refer to independent (free) variables. In other words, the function defined in the closure 'remembers' the environment in which it was created.

取自:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Closures

闭包是 Javascript 中一个非常强大的概念,所以如果您不熟悉它们,我建议您去读一读它。

现在我们如何使用它来解决您的问题?

var f = (function() {
    // scope a
    var xhr = [],
        successfulRequests = 0,
        responseString = "";

    for (i = 0; i < json.orderItem.length; i++){
        (function (i) {
            xhr[i] = new XMLHttpRequest();
            url = '/products/byId/' + json.orderItem[i].productId;
            xhr[i].open("GET", url, true);
            xhr[i].onreadystatechange = function () {
                if (xhr[i].readyState == 4 && xhr[i].status == 200) {
                    // scope b

                    // track successful requests here
                    successfulRequests++;                   // "remembered" through closure
                    responseString += xhr[i].responseText;  // "remembered" through closure

                    if(successfulRequests == json.orderItem.length) {
                        console.log(responseString);
                    }
                }
            };
            xhr[i].send();
        })(i);
    }
})();

在 scopeA 中声明的变量通过闭包被记住在 scopeB 中。

注意:此实现只会在所有请求成功完成后记录 responseString。您希望如何处理请求失败取决于您,但希望您现在应该知道如何处理。

关于javascript - 在一个循环中连接 XMLHTTPRequest 响应以记录所有循环何时完成,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25858537/

相关文章:

javascript - 使用jquery切换div的高度

javascript - jQuery ajax 成功链接 Internet Explorer 问题

javascript - 根据本地存储更改元素样式

javascript - 如何通过观察同一对象来更改对象属性值

javascript - 浮点加法的奇怪结果

javascript - Angular 如何动态更改数组中的值

javascript - 选择下拉列表中标记为列表的元素

javascript - 什么是支持 Javascript 的屏幕抓取的好工具?

javascript - 将 vuejs ID 传递给 data-url

javascript - 仅当它在 RegEx Javascript 中具有确切的出现次数时才替换