【发布时间】:2020-12-17 12:44:34
【问题描述】:
我有一个长时间执行的 PHP 脚本,它会生成一些文件。文件的总量是已知的。 单击按钮时,我想创建一个创建文件数量的进度条。 问题是,当长时间执行完成时,该栏只前进一次,并且完全填充它,而不是根据某个目录中的文件数量逐步填充。我不确定 JS 异步调用是否错误,或者异步 PHP 执行是否存在问题。当一个接一个地执行时,脚本本身可以正常工作。 任何帮助表示赞赏!
html:
<td class="Aktion">
<div class="Aktion-Text">Generieren</div>
<div class="Aktion-Ladebalken">
<div class="Aktion-Ladebalken-filler"></div>
<div class="Aktion-Ladebalken-Text"></div>
</div>
<input type="hidden" class="VSMon" value="1"/>
<input type="hidden" class="VSJahr" value="21"/>
</td>
计数文件的PHP代码:
chdir("../pdfgenerierung/rechnungen");
$anz = (glob("Rechnung_".date("ym",strtotime($VerrechnungsMonat))."*"));
chdir("../../arbeitsplan");
echo count($anz);
这是我的 JS 代码: 请注意,我总共构建了 5 次执行,以免陷入无限循环。
$(document).ready(function(){
$(".Aktion").on("click",async function(){
var vsmon = $(this).find(".VSMon").val();
var vsjahr = $(this).find(".VSJahr").val();
$(this).removeClass("Aktion"); //Prevent multiple execution
element = $(this);
$.ajax({
//Gets the total amount of files, works properly
url:"rgAnzahlBerechner.php?type=gesamt&VSMon="+vsmon+"&VSJahr="+vsjahr,
dataType:"text",
async:true,
success:function(daten){
var PatientenAnzahl = daten;
$(element).find(".Aktion-Text").remove();
$(element).find(".Aktion-Ladebalken").css({"height":"20px"});
$(element).find(".Aktion-Ladebalken").css({"border-width":"2px"});
$(element).find(".Aktion-Ladebalken-Text").html("0/"+PatientenAnzahl);
//Call to the long executing script, works properly aswell
$.ajax({
url:"../lfdverrechnung.php?VSMon="+vsmon+"&VSJahr="+vsjahr,
async:true,
success:function(){
console.log("Rechnungen erstellt");
}
});
temp(vsmon,vsjahr,element,PatientenAnzahl);
}
});
});
});
async function temp(vsmon,vsjahr,element,PatientenAnzahl){
var i=0;
while(i<5)
{
setTimeout(function(){
//PHP script which should return amount of files created
$.ajax({
url:"rgAnzahlBerechner.php?type=teil&VSMon="+vsmon+"&VSJahr="+vsjahr,
dataType:"text",
async:true,
success:function(daten){
var new_width = (daten/PatientenAnzahl) * 200;
new_width = Math.round(new_width);
console.log(new_width);
$(element).find(".Aktion-Ladebalken-filler").css({"width":new_width+"px"});
$(element).find(".Aktion-Ladebalken-Text").html(daten+"/"+PatientenAnzahl);
if(daten == PatientenAnzahl)
{
$(element).find(".Aktion-Ladebalken-Text").html("Fertig!");
return;
}
}
});
i++;
},500);
}
}
【问题讨论】:
标签: javascript php jquery ajax asynchronous