2017-07-18 28 views
2

私はパブリック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>

+1

あなたはたくさんのものを混ぜているようですが、ajax呼び出しからjQuery Deferredオブジェクトを実際に返す関数がたくさんあり、ネストされた呼び出し、ループ、配列などがあります。一般に、$ .whenを試してください。 [Promise.allの代わりに...($、約束します)。] – adeneo

答えて

0

それを解決しました。

+0

質問の編集リンクを使用して追加情報を追加してください。 [レビューから](/レビュー/低品質の投稿/ 16747438) –

関連する問題