异步Javascript:在继续执行新函数之前,等待在for循环中处理数据

时间:2018-05-06 19:56:23

标签: javascript arrays asynchronous callback promise

我遇到了解如何在forEach循环中解决Javascript异步行为的问题。这个问题非常复杂(抱歉),但循环的想法如下:

  • 循环遍历数组中的每个项目
  • 从提供程序脚本发出HTTP请求
  • 然后我需要将数组的每个元素乘以常量
  • 将新数组指定给对象中的项目
  • 在循环之后,取出所有数组并将它们一起添加到一个数组

数据将分配给 indvCoinPortfolioChartData 数组

我正在寻找我的事件循环中的任何缺陷。我相信这场战斗正在使这项任务同步,确保在汇总数据之前分配我的数据。

问题

当我将所有数组添加到一起时,不会对一个数据集进行求和(我认为因为它在调用函数后仍在处理)。没有错误,但它没有最终聚合数组中的所有硬币数据。

这是我在aggregatePortfolioChartData函数中看到的问题。它开始for循环,数组中只有2个项目,然后显示3.第三个项目直到for循环开始后才被处理。

image of console log (logged from aggregatePortfolioChartData function)

debug log when aggregation is successful

var indivCoinPortfolioChartData = {'data': []};
for(var i = 0; i < this.storedCoins.Coins.length; i++)
{  
  let entry = this.storedCoins.Coins[i];
  localThis._data.getChart(entry.symbol, true).subscribe(res => {localThis.generateCoinWatchlistGraph(res, entry);});
  localThis._data.getChart(entry.symbol).subscribe(res => {
    if(entry.holdings > 0)
    {
      let data = res['Data'].map((a) => (a.close * entry.holdings));
      indivCoinPortfolioChartData.data.push({'coinData': data});
      localThis.loadedCoinData(loader, indivCoinPortfolioChartData);
    }
    else
    {
      localThis.loadedCoinData(loader, indivCoinPortfolioChartData);
    }
  });
}

加载的硬币数据

loadedCoinData(loader, indivCoinPortfolioChartData)
{
  this.coinsWithData++;
  if(this.coinsWithData === this.storedCoins.Coins.length - 1)  
  {
    loader.dismiss();
    this.aggregatePortfolioChartData(indivCoinPortfolioChartData);
  }
}

aggregatePortfolioChartData

aggregatePortfolioChartData(indivCoinPortfolioChartData)
{
  console.log(indivCoinPortfolioChartData);
  var aggregatedPortfolioData = [];
  if(indivCoinPortfolioChartData.data[0].coinData)
  {
    let dataProcessed = 0;
    for(var i = 0; i < indivCoinPortfolioChartData.data[0].coinData.length; i++)
    {
      for(var j = 0; j< indivCoinPortfolioChartData.data.length; j++)
      {
        let data = indivCoinPortfolioChartData.data[j].coinData[i];
        if(data)
        {
          aggregatedPortfolioData[i] = (aggregatedPortfolioData[i] ? aggregatedPortfolioData[i] : 0) + data;
          dataProcessed++;
        }
        else
        {
          dataProcessed++;
        }
      }
      if(dataProcessed === (indivCoinPortfolioChartData.data[0].coinData.length) * (indivCoinPortfolioChartData.data.length))
      {
        console.log(dataProcessed + " data points for portfolio chart");
        this.displayPortfolioChart(aggregatedPortfolioData);
      }
    }
  }
}

感谢您帮我解决这个令人厌烦的问题。

0 个答案:

没有答案