我正在异步发出两个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请求合并为一个来完全避免问题,但我不确定字符限制是什么。
答案 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}}