Я вложил для l oop. Внешний l oop относится к уровню, а внутренний l oop относится к пункту. Под каждым уровнем есть 2 уровня и 3 элемента. Внутренний l oop должен работать ajax для каждого элемента. Итак, я использовал $.when().then()
. Я уже в состоянии запустить ajax в порядке синхронизации для каждого элемента. Но у меня возникла проблема во внешнем l oop, не дожидаясь, пока внутренний l oop обработает элементы уровня 1, прежде чем перейти к уровню 2. Я не дождался завершения первого уровня. Он сразу обрабатывает элементы уровня 2 в порядке синхронизации.
sql таблица записей в sql:
uid |level |description |
____|______|____________|
1 | 1 | a |
2 | 1 | b |
3 | 1 | c |
4 | 2 | a |
5 | 2 | b |
6 | 2 | c |
____|______|____________|
Код:
<?php
include 'config.php';
$sql ="SELECT level ,COUNT(*) AS count FROM record GROUP BY level;";
$data =fetchall_associate($conn,$sql);
/*
array(2) {
[0]=>
array(2) {
["level"]=>
string(1) "1"
["count"]=>
string(1) "3"
}
[1]=>
array(2) {
["level"]=>
string(1) "2"
["count"]=>
string(1) "3"
}
}
*/
?>
<html>
<head>
<script src="external_lib/jquery_3_4_1.min.js"></script>
<script>
//functions
function range(start, end)
{
return Array(end - start + 1).fill().map((_, idx) => start + idx)
}
function get_data(data)
{
level_key =0;
var iteration =function()
{
var level_p =$.when();
data.forEach(function(level_val,level_id)
{
item_ids =level_val['ids'];
level =level_val['level'];
level_p =level_p.then(function()
{
var item_p =$.when();
item_ids.forEach(function(item_val,item_id)
{
item_p =item_p.then(function()
{
console.log(level+'=>'+item_val);
return ajax_get_data(level,item_val);
})
})
})
})
}
iteration();
}
function ajax_get_data(level,item_id)
{
return $.ajax({
url :'1_circular_2.php',
data :{'level':level,'item_id':item_id},
type :'POST',
success:function(data)
{
//console.log(level+'=>'+item_id+'=>'+data);
}
});
}
</script>
<script>
$(document).ready(function()
{
var level_records ='<?php echo json_encode($data);?>';
level_records =JSON.parse(level_records);
c=0;
for(i=0;i<level_records.length;i++)
{
level =level_records[i]['level'];
c +=parseInt(level_records[i]['count']);
start_range =(level==1)?1:(c-level_records[(i-1)]['count']+1);
//create empty progress bar
$('#progress_bar_container').append('<div id="level_'+level_records[i]['level']+'"></div>')
//create array for record count
range_array =range(start_range,c);
level_records[i]['ids']=range_array;
}
get_data(level_records);
})
</script>
</head>
<body>
<div id="progress_bar_container">
</div>
</body>
</html>
console.log(level+'=>'+item_val);
output:
2=>4
2=>4
2=>5
2=>5
2=>6
2=>6
Выполняется на уровне 2 перед обработкой предметов, находящихся на первом уровне sh. Как это решить?
Заранее спасибо.