javascript - 在循环中等待嵌套的 Promise

标签 javascript jquery promise

我正在从公共(public) API 获取数据,并且需要了解中间调用来构建最后的相关调用。

但是,我无法构建一个在且仅当最终调用完成时才能解决的 promise 。

我尝试“链接”调用,每个调用都返回更深一层的 promise ,但是,填充表的主要 promise 在第一个调用完成时仍然解析(因此,数据尚未被推送到“结果”数组,并且该表无法填充)。

你能帮我解决这个问题吗?

(旁注:正如您可能已经理解的那样,我是初学者,因此欢迎对代码提出任何一般性建议/评论)。

let results = [];

function getData() {
  results = [];
  let promises = [];
  for (var i = 1; i < 2; i++) {
    let rankNbr = 1 //For consistency (Math.floor(Math.random() * 99) + 1)*i
    let data = {
      'api_key': 'd6207c18cd4c8980bcab7c7f21b60172',
      'metric': 'dps',
      'difficulty': 4,
      'class': 9,
      'spec': 1,
      'limit': 1,
      'page': rankNbr
    }

    promises.push($.get("https://www.warcraftlogs.com/v1/rankings/encounter/2037", data).done(function(data) {
      //Most of the time only one report, but it might be more in the future
      var loopPromises = []
      for (var i = 0; i < data.rankings.length; i++) {
        loopPromises.push(getEQpct(data.rankings[i], rankNbr));
      }
      return Promise.all(loopPromises)
    }));
  }

  Promise.all(promises).then(function() {
    alert(results.length);
    for (var i = 0; i < results.length; i++) {
      var row = document.createElement("tr");

      var nameCell = document.createElement("td");
      row.appendChild(nameCell);
      nameCell.innerText = results[i].name;

      var reportIDCell = document.createElement("td");
      row.appendChild(reportIDCell);
      reportIDCell.innerText = results[i].reportID;

      var rankCell = document.createElement("td");
      row.appendChild(rankCell);
      rankCell.innerText = results[i].rankNbr;

      var EQPctCell = document.createElement("td");
      row.appendChild(EQPctCell);
      EQPctCell.innerText = results[i].EQPercent;

      $("#resultsTable>tbody").append(row);
    }
  });

}

function getEQpct(ranking, rankNbr) {
  let fightData = {
    'api_key': 'd6207c18cd4c8980bcab7c7f21b60172',
    'translate': false
  }

  return $.get("https://www.warcraftlogs.com:443/v1/report/fights/" + ranking.reportID, fightData).done(function(data) {
    let damagedata = {
      'api_key': 'd6207c18cd4c8980bcab7c7f21b60172',
      'start': data.fights[ranking.fightID - 1].start_time, //ID #1 is in 0th position in the array.
      'end': data.fights[ranking.fightID - 1].end_time,
      'filter': "source.name='" + ranking.name + "'",
      'translate': false
    }
    return $.get("https://www.warcraftlogs.com:443/v1/report/tables/damage-done/" + ranking.reportID, damagedata).done(function(data) {
      let totalDamage = data.entries[0].total;
      let EQDamage;
      try {
        EQDamage = data.entries[0].abilities.filter(function(ability) {
          return ability.name == "Earthquake"
        })[0].total;
      } catch (err) {
        EQDamage = 0;
      }

      let SSDamage;
      try {
        SSDamage = data.entries[0].abilities.filter(function(ability) {
          return ability.name == "Seismic Lightning"
        })[0].total;
      } catch (err) {
        SSDamage = 0;
      }

      ranking.EQPercent = (EQDamage + SSDamage) / totalDamage * 100;
      ranking.rankNbr = rankNbr
      results.push(ranking);
    });
  });
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<button onclick="getData()">getData</button>

<table id="resultsTable">
  <thead>
    <th>Name</th>
    <th>ReportID</th>
    <th>Rank</th>
    <th>EQ pct</th>
  </thead>
  <tbody></tbody>
</table>

最佳答案

.done 更改为 .then 已解决。

关于javascript - 在循环中等待嵌套的 Promise,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45163517/

相关文章:

javascript - array.filter() 的 JS 函数问题

javascript - Chrome 检查器与 Javascript 数组

javascript - 如何访问 next .then() 中的日期 - 获取 api

javascript - AngularJS Promise - 如果数据仍在加载,则导航离开页面时出错

javascript - 删除html元素文本中的重复单词?

javascript - 带有 Passport-twitchtv 的 Express 服务器无法从我的 angularjs 客户端登录

javascript - jQuery 1.8.1 data() 检索 HTML5 数据属性时出错

Ajax加载器图像: How to set a minimum duration during which the loader is shown?

javascript - jquery悬停不显示链接

javascript - 为什么这个调用在继续之前不等待响应?