包含 promise 的对象数组在 for 循环中混乱
Array of objects containing promises messing up in a for loop
我有一个带有狗狗币地址的对象数组:
var wallets = [
{ address: 'DT2rmMrutwzdZ8EXwzj4QFdcL6DtvGGkci'},
{ address: 'DMoonjyH1aHLZc1kksmikBUhjXromn1ZN4'}
];
我还有一个简单的http请求函数:
function get(url) {
return new Promise(function(resolve, reject) {
var req = new XMLHttpRequest();
req.open('GET', url);
req.onload = function() {
if (req.status == 200) {
resolve(req.response);
}
else {
reject(Error(req.statusText));
}
};
req.onerror = function() {
reject(Error("Network Error"));
};
req.send();
});
}
我尝试使用 for 循环向包含 promise/api 响应的数组wallets
中的每个对象添加一个新属性:
for (i in wallets){
var balance = get('https://dogechain.info/api/v1/address/balance/'+wallets[i].address)
.then(
function(response){
wallets[i].balance = response;
},
function(error) {
wallets[i].balance = error;
}
);
};
console.log(wallets);
但是在每次迭代中,当 promise 被解析时,for 循环结束,将响应分配给最后一个对象。
我想要的是这样的数组:
[
{ address: 'DT2rmMrutwzdZ8EXwzj4QFdcL6DtvGGkci', balance: -balance from api response-},
{ address: 'DMoonjyH1aHLZc1kksmikBUhjXromn1ZN4', balance: -balance from api response-}
]
首先观察到返回的值是一个字符串而不是一个对象。
resolve(req.response);
更改为
resolve(JSON.parse(req.response));
如果我理解它,您想用所有承诺响应填充数组。
var wallets = [
{ address: 'DT2rmMrutwzdZ8EXwzj4QFdcL6DtvGGkci'},
{ address: 'DMoonjyH1aHLZc1kksmikBUhjXromn1ZN4'}
];
listPromises = wallets.map(function (wallet){
var balance = get('https://dogechain.info/api/v1/address/balance/'+wallet.address)
.then(function(response){
return {
address: wallet.address,
balance: response.balance
};
},
function(error) {
return {
address: wallet.address,
balance: error
}
}
);
return balance
});
Promise.all(listPromises)
.then(function(responseWallets){
console.log(responseWallets);
// add your script to continue
});
function get(url) {
return new Promise(function(resolve, reject) {
var req = new XMLHttpRequest();
req.open('GET', url);
req.onload = function() {
if (req.status == 200) {
resolve(JSON.parse(req.response));
}
else {
reject(Error(req.statusText));
}
};
req.onerror = function() {
reject(Error("Network Error"));
};
req.send();
});
}
我希望它有所帮助。享受!
根据@Bergi建议,我简化了脚本。
相关文章:
- 为什么JavaScript在for循环为3时向所有4发出警报
- 另一个ajax调用中的Jquery ajax调用在for循环中没有按预期工作
- 我的javascript for循环不起作用
- For循环冻结Javascript
- 如何在for循环中添加事件侦听器
- 双“for”循环(循环)
- javascript for循环不起作用
- for循环中的javascript if语句找不到==
- Javascript在for循环中等待处理请求
- For循环在Jquery中只运行一次
- 如何在for循环中使用计数器
- for循环中的JavaScript闭包
- 为什么我们在ES2015中需要一个新的for循环结构,而我们已经有了for、forEach
- For循环在调用时未运行
- 如何使用for循环添加所有按钮'单击事件
- 如何更改在for循环中生成的圆的位置
- 为什么这个For循环会使浏览器实验室崩溃
- 为什么我使用javascript获得了一个无限的for循环
- 在for循环中使用多维数组设置google.maps.Marker图标
- 如何在angularJS中运行for循环而不使用html标记