是的,您的以下循环有问题:
for (var prop in datas) {
$http.get("https://min-api.cryptocompare.com/data/pricemulti?fsyms=BTC&tsyms=USD&e=" + prop)
.then(function success(responsePrice) {
rand.push({'exchange' : prop, 'price' : responsePrice.data});
})
}
for (var prop in datas) { 行执行其所有迭代并
指向完成$http.get 请求之前的最后一个元素作为它的
异步请求。
所以,要做到这一点,需要一些机制来保证数据的合法性
在$http.get 通话时在场。
现在要执行此操作,已使用以下代码创建了一个数组
因为返回值是一个映射,并且很难在下一个递归中使用
功能:
datas = response.data;
console.log(datas);
for (var prop in datas) {
propArray.push(prop);
}
以下递归函数可确保在每个 $http.get 完成后更新您使用的 prop 项目的值:
var dataAcquireLoop = function () {
dataIndex++;
if(dataIndex >= propArray.length) {
console.log(rand);
return;
}
console.log(propArray[dataIndex]);
$http.get("https://min-api.cryptocompare.com/data/pricemulti?fsyms=BTC&tsyms=USD&e=" + propArray[dataIndex])
.then(
function success(responsePrice) {
rand.push({'exchange' : propArray[dataIndex], 'price' : responsePrice.data});
dataAcquireLoop();
},
function(error) {
dataAcquireLoop();
}
);
}
下面给出的最终更新代码:
app.controller("Ctrl", function ($scope, $http) {
var rand = [];
var datas = [];
var dataIndex = -1;
var propArray = [];
var dataAcquireLoop = function () {
dataIndex++;
if(dataIndex >= propArray.length) {
console.log(rand);
return;
}
console.log(propArray[dataIndex]);
$http.get("https://min-api.cryptocompare.com/data/pricemulti?fsyms=BTC&tsyms=USD&e=" + propArray[dataIndex])
.then(
function success(responsePrice) {
rand.push({'exchange' : propArray[dataIndex], 'price' : responsePrice.data});
dataAcquireLoop();
},
function(error) {
dataAcquireLoop();
}
);
}
$http({
method: "GET",
url: "https://min-api.cryptocompare.com/data/all/exchanges"
}).then(function success(response) {
datas = response.data;
console.log(datas);
for (var prop in datas) {
propArray.push(prop);
}
dataAcquireLoop();
});
});