私はパブリックAPIからデータを取得しており、最後の適切な呼び出しを構築するために中間呼び出しに関する知識が必要です。ループ内でネストされた約束を待つ
しかし、最終的な呼び出しが行われたときに解決する約束はできません。
私は呼び出しをチェーンしようとしましたが、それぞれが1つの層を約束して返すようにしましたが、最初の呼び出しが完了したときに解決される主な約束事は(結果として、データは 'results'配列にまだプッシュされておらず、テーブルを埋めることができません)。
私はこれを理解してもらえますか?
(ご存知のように、私は初心者ですので、コードに関する一般的なアドバイス/コメントは歓迎します)。 .then
から.done
を変更
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>
あなたはたくさんのものを混ぜているようですが、ajax呼び出しからjQuery Deferredオブジェクトを実際に返す関数がたくさんあり、ネストされた呼び出し、ループ、配列などがあります。一般に、$ .whenを試してください。 [Promise.allの代わりに...($、約束します)。] – adeneo