Прошу помощи у сообщества ((
Мучаю код уже третью неделю, не могу понять в чём причина...
Исходные данные:
На сервере есть html
с забиваемыми исходными данными, по которым jscript
c помощью jquery
запрашивает с сайта инфу по ряду критериев через представленный API. Данные запрашиваются по ID последовательно (со стороны API есть ограничение на кол-во запросов в секунду, но дело не в нём), например 1-10000 или 25000000-30000000
Ответ получаемые в json
парсится и выводится на ту же страницу.
Исходный код html:
<html>
<head>
<meta http-equiv="Content-type" content="text/html; charset=utf-8" />
<meta name="viewport" content="width=device-width,initial-scale=1.0">
<title> API test</title>
</head>
<body ng-app="Test_App">
<div id="bodyMain">
Filter Greater Than Last Battle: <input type="date" id="lastDate" />
Search By ID (FROM): <input type="number" id="fromID" value="x"/> Search By ID (TO): <input type="number" id="toID" value="xxxxx" /> <br>
<br>
WinRate From %: <input value="xx" type="number" id="winRateFrom" /> To <input value="xx" type="number" id="winRateTo" />
<br> <!-- default item for winrate filter -->
Exp: <input type="number" id="_avg_xp_Default" value="xxx" />
<br>
Rating : <input type="number" id="_global_rating_Default" value="xxx" />
<br>
battles : <input type="number" id="_clan_battles_Default" value="xxx" />
<br>
Attack <input type="number" id="_str_A_battles_Default" value="xxx" />
<br>
Defence : <input type="number" id="_str_D_battles_Default" value="xxx" />
<br>
<input type="button" value="Search" onclick="getFunction(true)" />
<br>
ID Received : <span id="pendingID">0</span> of <span id="toPendingID">0</span>
<span id="alertMsg"></span>
<br>
<input type="button" onclick="exportExcel(event)" id="btnExport" value="Export as Excel File" />
<table id="table_wrapp" style="width: 1200px;">
<thead>
<th>Account ID</th>
<th>Nickname</th>
<th>Last Battle</th>
<th>Created at</th>
<th>Global Rating</th>
<th>Average XP</th>
<th>Clan battles All </th>
<th>Stronghold Atack</th>
<th>Stronghold Defense</th>
<th>Win</th>
<th>Loses</th>
<th>Win %</th>
</tr>
</thead>
<tbody>
</tbody>
</table>
</div>
<script src="jquery-3.2.1.js" defer="defer"></script>
<script src="jquery.excel.js" defer="defer"></script>
<script src="main.js?v2" defer="defer"></script>
</body>
</html>
Исходный код скрипта:
var accountFields = 'statistics.all.losses%2Cstatistics.all.wins%2Cstatistics.all.battles%2Cclan_id%2Cprivate.gold%2Caccount_id%2Clast_battle_time%2Ccreated_at%2Cglobal_rating%2Cstatistics.all.battle_avg_xp%2Cstatistics.clan.battles%2Cstatistics.globalmap_absolute.battles%2Cstatistics.globalmap_champion.battles%2Cstatistics.stronghold_defense.battles%2Cstatistics.stronghold_skirmish.battles%2Cnickname%2Cclient_language%2Cglobal_rating' //Separted by , > "%2C" without quote
var applicationID = '********';
var reqPerMilSecond = 40 ; //Request Per Milisecond. Will send request every 40 Milisec (1000 = 1sec)
var counter = 1;
var counter2 = 1;
var max = 100000000;
var html = []
function getFunction(flag){
if(flag){
$('#alertMsg').text('Please Wait')
counter = parseInt($('#fromID').val());
max = parseInt($('#toID').val());
$('table>tbody').html('<tr><td colspan="5">Waiting For Response</td></tr>');
$('#toPendingID').text(max);
if(counter > max){
alert('To ID must be greater than From')
return;
}
}
if($('#lastDate').val() == ''){
alert('Please Input Date')
return;
}
var query = getIds();
main(query,function(data){
var html = [];
data = $.parseJSON(data);
var data = data.data
var date = new Date(document.getElementById("lastDate").value);
var winT = parseInt($('#winRateTo').val())
var winF = parseInt($('#winRateFrom').val())
var _avg_xp_D = parseInt($('#_avg_xp_Default').val())
var _global_rating_D = parseInt($('#_global_rating_Default').val())
var _clan_battles_D = parseInt($('#_clan_battles_Default').val())
var _str_A_battles_D = parseInt($('#_str_A_battles_Default').val())
var _str_D_battles_D = parseInt($('#_str_D_battles_Default').val())
for(attr in data){
if(data[attr] && !data[attr]['clan_id']){ //This will check if there's a valid Player (data[attr])
var _date = new Date(parseInt(data[attr]['last_battle_time'])*1000);
var _battles = parseInt(data[attr]['statistics']['all']['battles']) || 0;
var _wins = parseInt(data[attr]['statistics']['all']['wins']) || 0;
var _winRate = (_wins/_battles)*100;
var _avg_xp = parseInt(data[attr]['statistics']['all']['battle_avg_xp']) || 0;
var _global_rating = parseInt(data[attr]['global_rating']) || 0;
var _clan_battles_all = parseInt(data[attr]['statistics']['clan']['battles']) || 0;
var _str_A_battles = parseInt(data[attr]['statistics']['stronghold_skirmish']['battles']) || 0;
var _str_D_battles = parseInt(data[attr]['statistics']['stronghold_defense']['battles']) || 0;
if(_date.getTime() >= date.getTime()){ //Filter player time
if (winF<=_winRate && winT>=_winRate && _avg_xp>=_avg_xp_D && _global_rating>=_global_rating_D && _clan_battles_all>=_clan_battles_D && _str_A_battles>=_str_A_battles_D && _str_D_battles>=_str_D_battles_D)
{
var tempHTML = '<tr>';
var _lastBattle = getCurrDate(new Date(parseInt(data[attr]['last_battle_time']) * 1000));
var tempHTML = '<tr>';
var _lastBattle = getCurrDate(new Date(parseInt(data[attr]['last_battle_time']) * 1000));
var _loses = parseInt(data[attr]['statistics']['all']['losses']) || 0;
var _created_at = getCurrDate(new Date(parseInt(data[attr]['created_at']) * 1000));
var tempHTML = '<tr>';
tempHTML += '<td>'+data[attr]['account_id']+'</td>';
tempHTML += '<td>'+data[attr]['nickname']+'</td>';
tempHTML += '<td>'+_lastBattle+'</td>';
tempHTML += '<td>'+_created_at+'</td>';
tempHTML += '<td>'+_global_rating+'</td>';
tempHTML += '<td>'+_avg_xp+'</td>';
tempHTML += '<td>'+_clan_battles_all+'</td>';
tempHTML += '<td>'+_str_A_battles+'</td>';
tempHTML += '<td>'+_str_D_battles+'</td>';
tempHTML += '<td>'+_wins+'</td>';
tempHTML += '<td>'+_loses+'</td>';
tempHTML += '<td>'+parseFloat(_winRate).toFixed(2)+'</td>';
tempHTML += '</tr>'
html.push(tempHTML);
}
}
}
}
if(tempHTML!=''){
$('table>tbody').append(html.join());
}
counter2 += 100;
if(counter2 >= max)
{
$('#alertMsg').text('Done')
}
$('#pendingID').text(counter2);
},function()
{
})
if(counter >= max){
}else{
setTimeout(function(){counter += 100; getFunction();}, reqPerMilSecond);
}
}
function getIds(){
var maxID = counter +100;
var html2 = [];
for(var x = counter;x<maxID;x++){
html2.push(x)
}
return html2.join('%2C');
}
return html2.join('%2C');
}
main = function(query,callback,errorCallback){
var contentType ="application/x-www-form-urlencoded; charset=utf-8";
var url = 'https://*****adress_syte*****/account/info/?application_id='+applicationID+'&';
url += 'account_id='+query+'&';
url += 'fields='+accountFields
query = query;
var dataSend = query
$.ajax({
url :url,
data : { 'data': dataSend },
dataType: 'html',
contentType:contentType,
method:'POST',
success: function(datares){
datares = $.trim(datares);
var mydata = datares.replace(/'/g,'"');
callback(mydata);
},error: function(xhr){
}
});
}
getCurrDate = function(d){
var mon = (d.getMonth()+1)
var day = ( d.getDate() )
if(mon.toString().length == 1){
mon = "0"+mon.toString();
}
if(day.toString().length == 1){
day = "0"+day.toString();
}
var strDate = d.getFullYear() + "-" + mon + "-" + day;
var hr = d.getHours();
var min = d.getMinutes();
return strDate+' '+hr+':'+min;
}
Если запрашивать небольшой диапозон вроде 1-100000 и выбирать небольшую скорость запросов - всё ок.
А вот если запросить опрос диапозона ID в несколько миллионов например
30,000,000-35,000,000, то в логах chrome через некоторое время вылезает ошибка (опытным путём установленно, что даже на низкой скорости опроса):
jquery-3.2.1.js:9566 POST https://****адрес запроса**** net::ERR_INSUFFICIENT_RESOURCES
сама строка 9566:
// Do send the request (this may raise an exception) xhr.send( options.hasContent && options.data || null );
Я как программист нулевого уровня, подозреваю что это либо сам сервак не тянет (сокетов ему не хватает, хз, я незнаю), либо где-то в коде какая-то утечка памяти или что-то в этом духе...
При необходимости могу выложить timeline и профили chrome ...
Помогите, пожалуйста (( ..
Айфон мало держит заряд, разбираемся с проблемой вместе с AppLab
Перевод документов на английский язык: Важность и ключевые аспекты
Какие существуют виды рекламных бордов и как выбрать подходящий?
Совершенно не могу понять как заспавнить печеньку(картинку) и затем убрать ее через пару секундaВ куки кликере при клике спавнятся печеньки...
Как из обычного popup календаря сделать постоянно видимый календарик с отображением времениТипа этого
Уважаемые коллеги, у меня такая проблема: я делаю первый проект на JS+CSS, и я не знаю CSS совсемВ связи с этим - вопрос: Когда то была такая программа...