从我对setTimeout()和setInterval()的研究看来,它似乎应该可以工作,但是在它停止等待的时候就会中断,并且控制台会输出错误信息。
我设置了一个页面来执行许多服务器端和客户端性能测试,然后执行ajax调用以将测试结果保存到数据库。它工作得很好,但最近我添加了一个浏览器测试(基于谷歌的Octane代码)。我想要做的是让jQuery等到Octane完成并产生最终得分并填充该得分的div,然后执行ajax调用以保存所有测试结果。我尝试在递归函数中使用setTimeout()来做到这一点,但代码在saveData()ajax调用之前就失败了。 Octane将运行,该函数将按预期运行并且每隔5秒继续调用一次,然后Octane完成并且函数调用saveData(),这就是它中断的地方。
这是基本的代码结构:
...Octane code
...<div id="finalScore" style="display:none;">When Octane is done, it will change display of this div to block and populate it with test score</div>
<script>
$(document).ready(function() {
//set some vars
var waitCounter = 0;
var request = $.ajax({//this is a test of download time
url: path to a text file
type: "GET",
success: function(result) {
//crunch some numbers
var requestUpload = $.ajax({//only want to do upload test if download was successful
url: //path to a file
type: 'POST',
data: formData,
processData: false,
contentType: false,
mimeType: 'multipart/form-data',
cache: false,
success: function(data) {
//crunch some numbers
waitForClientScore();//new function, replaces saveData() below
//saveData(nDLSpeedMbps, nULSpeedMbps, nLoopSpeedMbps, nQuerySpeedMbps, nReadSpeedMbps, nWriteSpeedMbps, nAvgLoop, nAvgQuery, nAvgRead, nAvgWrite);
}
});
requestUpload.fail(function(xhr, status) {
//handle upload fail
});
}
});
request.fail(function( jqXHR, textStatus ) {
//handle download fail
});
function clientScoreReady() {//is Octane done yet?
var clientScoreDiv = document.getElementById('finalScore');
var divDisplayValue = clientScoreDiv.style.display;
return (divDisplayValue == "block");
}
function waitForClientScore() {
if (clientScoreReady()) {
clearTimeout(t);
saveData(nDLSpeedMbps, nULSpeedMbps, nLoopSpeedMbps, nQuerySpeedMbps, nReadSpeedMbps, nWriteSpeedMbps, nAvgLoop, nAvgQuery, nAvgRead, nAvgWrite);
}
else if (waitCounter >= 12) {//make 12 recursive calls max (60 sec)
clearTimeout(t);
console.log("timed out after 12 recursive calls");
}
else {//recursive function call
waitCounter = waitCounter + 1;
console.log(waitCounter);
t = setTimeout(waitForClientScore, 5000);
}
}
function saveData(nDLSpeedMbps, nULSpeedMbps, nLoopSpeedMbps, nQuerySpeedMbps, nReadSpeedMbps, nWriteSpeedMbps, nAvgLoop, nAvgQuery, nAvgRead, nAvgWrite){
//put all argument values into userdata struct
$.ajax({
url : path to page that saves userdata to DB
type: "POST",
data : userdata,
success: function(data, textStatus, jqXHR) {
//handle success
},
error: function (jqXHR, textStatus, errorThrown) {
//handle fail
}
});
}
});
</script>
当我执行页面并观察控制台时会发生这种情况:Octane正在运行,而waitForClientScore()函数看到Octane未完成,因此它成功递增waitCounter并在5秒内调用自身。然后当Octane完成时,Octane填充div并将其显示从none更改为block。 WaitForClientScore()看到显示是块,并调用saveData()。然后saveData()内部的ajax调用失败 - 控制台输出一条消息“$ is not defined”。
saveData()(已注释掉)在转移到waitForClientScore()之前工作正常。
我尝试将waitForClientScore()放在上传成功函数中,但是同样的事情发生在来自控制台的不同错误消息中。 waitForClientScore()一直调用自己,直到Octane完成,然后控制台输出一条消息,说waitForClientScore()不是函数。
答案 0 :(得分:0)
您是否尝试过jQuery.ajax?你也可以尝试console.log(jQuery(body));这可能是因为jQuery在您当前的范围内不可用。 - battletoilet