2017-07-18 3 views
2

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>

+1

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

Antwort

0

.done zu .then Änderung hat es gelöst.

+0

Bitte benutzen Sie den Link zum Bearbeiten Ihrer Frage, um zusätzliche Informationen hinzuzufügen. Die Schaltfläche Post Answer sollte nur für vollständige Antworten auf die Frage verwendet werden. [Aus Bewertung] (/ review/low-quality-posts/16747438) –

Verwandte Themen