我使用下面的函数检查JSON文件的状态。它每8秒运行一次(使用setTimeout)来检查文件是否已更改。一旦JSON的状态变为“成功”,我就不再想继续调用该函数了。有人可以告诉我该怎么做吗?我怀疑它涉及使用clearTimeout,但我不确定如何实现它。
干杯!
$(function() {
var checkBookStatus = function() {
var job_id = "#{@job.job_id}";
var msg = $('.msg');
var msgBuilding = $('#msg-building');
var msgQueuing = $('#msg-in-queue');
var msgSuccessful = $('#msg-successful-build');
var msgError = $('#msg-error');
$.ajax({
url: '/jobs/'+job_id+'/status.json',
datatype: 'JSON',
success:function(data){
if (data.status == "failure") {
msg.hide();
msgError.show();
}
else if (data.status == "#{Job.queue}") {
msg.hide();
msgQueuing.show();
}
else if (data.status == "#{Job.building}") {
msg.hide();
msgBuilding.show();
}
else if (data.status == "#{Job.failure}") {
msg.hide();
msgError.show();
}
else if (data.status == "#{Job.success}") {
msg.hide();
msgSuccessful.show();
}
},
}).always(function () {
setTimeout(checkBookStatus, 8000);
});
};
checkBookStatus();
});
答案 0 :(得分:5)
t = setTimeout(checkBookStatus, 8000);
当您决定停止超时时,请使用此clearTimeout(t);
。
答案 1 :(得分:4)
使用clearTimeout
e.g。你定义了:
id = setTimeout(checkBookStatus, 8000);
然后您可以通过以下方式删除此功能:
clearTimeout(id)
答案 2 :(得分:2)
使用clearTimeout
之前返回的值调用setTimeout
。这会给你类似的东西:
$(function() {
var timeoutID;
var checkBookStatus = function () {
[…]
else if (data.status == "#{Job.success}") {
clearTimeout(timeoutID);
[…]
}).always(function () {
timeoutID = setTimeout(checkBookStatus, 8000);
[…]
答案 3 :(得分:2)
使用setTimeout
时,请按照以下方式使用:
var myTime = setTimeout(checkBookStatus, 8000);
清除它:
clearTimeout(myTime);
答案 4 :(得分:2)
在最后致电checkBookStatus()
之前,请拨打另一个电话:var interval = setInterval(checkBookStatus, 8000);
。然后,您可以成功clearInterval(interval)
。
不要使用setTimeout
进行迭代。
很多答案建议只使用clearTimeout()
但是,您在超时过期后检查状态,没有超时要清除。您无需在setTimeout()
功能中调用always()
,也不需要清除任何内容。因此,您可以重新检查我认为的always()
函数中的状态,但是您的data
对象不在那里。最好只使用setInterval()
函数的<{1}} 。
checkBookStatus()
答案 5 :(得分:0)
以下应该有效...
setTimeout函数返回setTimeout函数的一个实例。如果要阻止事件再次触发,请将此值保存在变量中并将其传递给函数clearTimeout。
即
var t = setTimeout(1000, someFunction);
...
//after you no longer need the timeout to fire, call
clearTimeout(t);