我有一些带有setInterval和setTimeout的jQuery代码。
这似乎每 6 秒工作一次:
var vasen = 0;
setInterval(function() {
vasen++;
$('#valvonta').stop(true,true).css("left", vasen);
var valvonta = 1;
var kilpailu = 12;
jQuery.post("ilmoittautuneet.php", {
valvonta: valvonta,
kilpailu: kilpailu
}).done(function(data) {
});
}, 6000);
但这不会每 6 秒工作一次。它只工作一次。原因是什么?
var vasen = 0;
(function valvonta() {
vasen++;
$('#valvonta').stop(true,true).css("left", vasen);
var valvonta = 1;
var kilpailu = 12;
jQuery.post("ilmoittautuneet.php", {
valvonta: valvonta,
kilpailu: kilpailu
}).done(function(data) {
});
setTimeout(valvonta, 6000);
})();
您的问题在于您正在覆盖valvonta
在此行中引用的内容:
var valvonta = 1;
这意味着valvonta
将不再引用函数本身,而是1
。因此,函数在第一次运行后失败。要解决此问题,只需使用另一个变量名称:
var vasen = 0;
(function valvonta() {
vasen++;
$('#valvonta').stop(true,true).css("left", vasen);
// Rename variables so they don't override `valvonta`
var v = 1;
var k = 12;
jQuery.post("ilmoittautuneet.php", {
valvonta: v,
kilpailu: k
}).done(function(data) {
});
setTimeout(valvonta, 6000);
})();
此解决方案虽然功能强大,但仍然使其可读性不强。简单地在IIFE中打电话给setInterval
怎么样?
var vasen = 0;
(function () {
// Declare function to be called recursively
var valvonta = function() {
vasen++;
$('#valvonta').stop(true,true).css("left", vasen);
// Rename variables so they don't override `valvonta`
var v = 1;
var k = 12;
jQuery.post("ilmoittautuneet.php", {
valvonta: v,
kilpailu: k
}).done(function(data) {
});
};
// Recursively call function
setInterval(valvonta, 6000);
})();
更新:我有一种感觉,你可能想在 AJAX 的done
回调之后调用该函数。如果是这种情况,您将需要重新设计上面的逻辑:
var vasen = 0;
(function () {
// Declare function to be called recursively
var valvonta = function() {
vasen++;
$('#valvonta').stop(true,true).css("left", vasen);
// Rename variables so they don't override `valvonta`
var v = 1;
var k = 12;
// Store AJAX promise in variable
var ajaxCall = jQuery.post("ilmoittautuneet.php", {
valvonta: v,
kilpailu: k
});
// When AJAX promise is resolved
ajaxCall.done(function() {
setTimeout(valvonta, 6000);
});
};
// Call function for the first time
valvonta();
})();