[英]How can I stop this setTimeout function from running?
我使用下面的函數來檢查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();
});
t = setTimeout(checkBookStatus, 8000);
當你決定停止超時使用這個clearTimeout(t);
。
使用clearTimeout
例如你定義:
id = setTimeout(checkBookStatus, 8000);
然后你可以通過以下方式刪除此功能
clearTimeout(id)
使用setTimeout
先前返回的值調用clearTimeout
。 這會給你一些類似的東西:
$(function() {
var timeoutID;
var checkBookStatus = function () {
[…]
else if (data.status == "#{Job.success}") {
clearTimeout(timeoutID);
[…]
}).always(function () {
timeoutID = setTimeout(checkBookStatus, 8000);
[…]
使用setTimeout
,請使用如下:
var myTime = setTimeout(checkBookStatus, 8000);
清除它只是:
clearTimeout(myTime);
在最后調用checkBookStatus()
之前,再調用一次: var interval = setInterval(checkBookStatus, 8000);
。 然后在成功時你可以clearInterval(interval)
。
不要使用setTimeout
進行迭代。
很多答案建議只使用clearTimeout()
但是,您在超時過期后檢查狀態,沒有超時要清除。 您不需要在always()
函數中調用setTimeout()
而不是清除任何內容。 所以你可以重新檢查我想的always()
函數里面的狀態,但你的data
對象不在那里。 最好只在checkBookStatus()
函數之外使用setInterval()
。
$(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();
clearInterval(interval);
}
}
});
};
var interval = setInterval(checkBookStatus, 8000);
checkBookStatus();
});
以下應該工作......
setTimeout函數返回setTimeout函數的一個實例。 將此值保存在變量中,並在希望防止事件再次觸發時將其傳遞給函數clearTimeout。
即
var t = setTimeout(1000, someFunction);
...
//after you no longer need the timeout to fire, call
clearTimeout(t);
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.