Ich erhalte Daten von einer öffentlichen API und benötige Kenntnisse über die Zwischenrufe, um den letzten relevanten Anruf aufzubauen.Warten auf geschachteltes Versprechen in einer Schleife
Allerdings kann ich nicht ein Versprechen bauen, das löst, wenn und nur wenn der letzte Anruf getätigt wurde.
Ich habe versucht, die Anrufe zu "verketten", jeder von ihnen gibt ein Versprechen eine Schicht tiefer zurück, jedoch löst das Hauptversprechen, das die Tabelle füllt, immer noch auf, wenn der erste Anruf erledigt ist (als Konsequenz Die Daten wurden noch nicht in das Array 'results' übertragen, und die Tabelle kann nicht ausgefüllt werden.
Könnten Sie mir bitte helfen, dies herauszufinden?
(Randnotiz: Wie Sie vielleicht verstanden haben, bin ich ein Anfänger, so dass jeder allgemeine Hinweis/Kommentar auf den Code ist willkommen).
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>
Sie scheinen eine Menge Zeug zu mischen, es gibt eine Menge von Funktionen, die tatsächlich jQuery verzögerte Objekte von Ajax-Aufrufe zurückgibt, und dann gibt es verschachtelte Aufrufe, Schleifen, Arrays usw. Im Allgemeinen sollten Sie '$ .when versuchen. apply ($, provents) .then (... 'anstelle von' Promise.all' – adeneo