我有一个页面,我在其中触发 ajax 请求并在用户按下按钮后的前 6 秒显示加载标志:
<button onclick="runLoader();"></button>
<script>
var startTime=(new Date).getTime();
function runLoader(){
runAjax();
var i=0;
var timer = setInterval(function(e){
i++;
//code for loading sign
if(i==3)
clearInterval(timer);
} ,2000);
}
function runAjax(){
$.ajax({
//
}).done(function(){
var timer2 = setInterval(function(){
var d = new Date();
var t = d.getTime();
if(t-startTime>=6000){
clearInterval(timer2);
// do X
}
},500);
}
}
</script>
我只想在两者都运行 6 秒并产生响应后才执行操作X ,并且不会更早。runLoader()
runAjax()
就像,如果 runAjax() 在 2 秒内响应,我仍然想继续显示加载标志 6 秒,然后执行X。如果加载标志显示了 6 秒,我想等待 runAjax() 返回,只要它需要。
但是使用该Date()
方法会给出不准确的结果。例如:即使仅经过 2 秒,它也显示经过了 7.765 秒。我在某个地方读到了我应该使用的地方console.log(time)
以获得更好的准确性,但它在 <= IE9 中不起作用。
有没有更好的方法来解决这个问题?
注意:我使用setInterval()
而不是setTimeout()
因为加载涉及循环通过 3 个元素的数组,“Fetching”、“Processing”和“Loading”每个显示 2 秒 :)