并行异步XMLHttpRequests只回调一次

时间:2015-05-23 23:22:40

标签: javascript

我正在异步发出两个API调用,因此我没有锁定浏览器,而且我只收到一个回调。

这是代码

/* Loop runs twice, from 0 to 1 */
for(var AccountIndex in walletForm.masterpublicKey){
    /* Bunch of code, then... */

    /* Construct an API call to Insight */
    var xhr = new XMLHttpRequest();
    xhr.open("GET", "https://insight.bitpay.com/api/addrs/" + stringOfAddresses + "/txs?from=0&to=100", true);
    xhr.onreadystatechange = function() {
        if (xhr.readyState == 4) {
        $scope.$apply(function () {
            txListInsight.txs[AccountIndex] = ( JSON.parse(xhr.responseText));
            /* Set semaphore */
            txListInsight.txsReady[AccountIndex] = true;
            parseTransactions(AccountIndex);
            console.log(txList);
        })
        }
    }
    xhr.send();
}

我甚至可以在Chrome开发者控制台网络标签中看到这两个请求,并且回复正确无误。为什么我只收到一个回调而不是两个?我的第二个回调是否覆盖了对第一个回调的引用?

为什么互联网上有一个名为“AsyncXMLHttpRequest”的图书馆?我也在使用AngularJS - 我应该看看"承诺"?

另一种选择是通过将我的两个API请求合并为一个来完全避免问题,但我不确定字符限制是什么。

1 个答案:

答案 0 :(得分:1)

我认为显式调用当前var xhrs = {}; for(var AccountIndex in walletForm.masterpublicKey){ (function(AccountIndex) { xhrs[AccountIndex] = new XMLHttpRequest(); xhrs[AccountIndex].open("GET", "https://insight.bitpay.com/api/addrs/" + stringOfAddresses + "/txs?from=0&to=100", true); xhrs[AccountIndex].onreadystatechange = function() { if (xhrs[AccountIndex].readyState == 4) { $scope.$apply(function () { txListInsight.txs[AccountIndex] = ( JSON.parse(xhrs[AccountIndex].responseText)); /* Set semaphore */ txListInsight.txsReady[AccountIndex] = true; parseTransactions(AccountIndex); console.log(txList); }) } } xhrs[AccountIndex].send(); })(AccountIndex); } 的函数应该有效,请注意闭包

{{1}}