我每3秒发出一次AJAX POST请求以获取进程的状态。这非常有效。
当进程达到100%时,执行回调函数(如下所示)向页面添加新元素,然后取消用于每3秒连续获取进度的setTimeout方法。但是,我的用户告诉我,它有时无法取消,并且新元素没有添加到页面中,而且我一直认为它会显示“100%”。
我一次又一次地测试过它,它永远不会被我困住。代码也看起来不错,但我的JavaScript技能不是很好所以我希望有人能指出是否有可能发生这个问题?
我对代码进行了评论,道歉很长。我试图减少它。
function convertNow(validURL){
startTime = setTimeout('getStatus();', 6000);
//AJAX CALL TO RUN PROCESS
$.ajax({
type: "GET",
url: "main.php",
data: 'url=' + validURL + '&filename=' + fileNameTxt,
success: function(msg){
//ON SUCCESS CLEAR SETTIMEOUT AND SHOW ELEMENTS (text)
clearTimeout(continueTime);
clearTimeout(startTime);
$("#loading").hide("slow");
$("#done").html("Done");
}//function
});//ajax
}//function convertNow
function getStatus(){
//AJAX CALL TO GET STATUS OF PROCESS
$.ajax({
type: "POST",
url: "fileReader.php",
data: 'textFile=' + fileNameTxt,
success: function(respomse){
textFileResponse = respomse.split(" ");
$("#done").html("Processing...");
}
});//ajax
clearTimeout(continueTime);
if(textFileResponse[0]=='100.0%'){
clearTimeout(continueTime);
}
else{
clearTimeout(startTime);
continueTime = setTimeout('getStatus();', 3000);
}
}
答案 0 :(得分:4)
在某些边缘情况下,textFileReponse [0] =='100.0%'中可能存在解析错误,响应中的值不完全等于100.0%(可能存在额外的空格,或者可能存在一些细微差别一些平台等...)。这会导致代码落入else {}块,并且您的getStatus函数将再次排队。
编辑:鉴于评论中的线程,在两个Ajax代码块之间存在竞争条件也是一个相等的可能性。 (这只是为了读者的利益而放在这里)。结束编辑
除了解析解析之外,您可能还需要使用setInterval(),只使用一个计时器,而不是startTime和continueTime计时器。 setTimeout只执行一次,而setInterval每隔x毫秒重复一次,所以你只需要一个。要取消setInterval,请使用clearInterval。