包含 promise 的对象数组在 for 循环中混乱

Array of objects containing promises messing up in a for loop

本文关键字:for 循环 混乱 数组 promise 对象 包含      更新时间:2023-09-26

我有一个带有狗狗币地址的对象数组:

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建议,我简化了脚本。