jquery 循环中的 setTimeout 一直在启动
jquery setTimout in loop just keeps launching
我有一个 Ajax 请求,我想每 5 秒启动一次以查看进程是否已完成。为此,我尝试使用 setTimout(),但它只是在不考虑超时的情况下一个接一个地启动一个进程。我已经在 SO 上阅读了多个关于此的问题并尝试实现答案,但是我无法让它工作。我必须更改什么才能使其正常工作?
<script type="text/javascript">
$(function() {
$(document).ready(function() {
var user = $('.user-id').text()
var url = '/ajaxurl'
var success = 0
var time = 0
var dataString = 'email='+user;
checkServer(url,user,time,success,dataString);
});
function checkServer(url, user, time, success, dataString) {
setTimeout(
$.ajax({
type: "POST",
url: url,
data: dataString,
success: function(data) {
if (data == 'True') {
success = 1
window.location = "https://www.someurl.com";
}
else {
time++
console.log(time);
console.log(data);
if ((success == 0) && (time < 60)) {
checkServer(url, user, time, success, dataString)
}
}
}
}), 5000);
};
});
</script>
除了@Taplar 的回答之外,我还建议您在创建新超时计时器之前清除超时计时器:
var myTimer = null;
function checkServer(url, user, time, success, dataString) {
clearTimeout( myTimer );
myTimer = setTimeout(
...
否则你将不会总是有 5 秒的延迟,例如 ajax 将比之前的超时回调执行得更快。
尝试将您的 $.ajax() 调用包装在一个函数中 (){}
setTimeout(function(){ $.ajax({ ... })}, 5000);
否则会在编译时立即触发。
如果您希望您的代码在页面打开时每 5 秒 运行,您最好使用 setInterval。如果您想使用一次代码,则只能使用 setTimeout。如果你想在某个变量变成 true/false 时打破间隔,那么你可以使用 clearInterval
对于您的代码:
function checkServer(url, user, time, success, dataString) {
$.ajax({
type: "POST",
url: url,
data: dataString,
success: function(data) {
if (data == 'True') {
success = 1
window.location = "https://www.someurl.com";
}
else {
time++
console.log(time);
console.log(data);
// DEFINE A NOT SUCCESS HERE!
if (false) {
clearInterval(intVal);
}
}
}
});
};
$(document).ready(function() {
var user = $('.user-id').text()
var url = '/ajaxurl'
var success = 0
var time = 0
var dataString = 'email='+user;
var intVal = setInterval(function(){
checkServer(url,user,time,success,dataString);
}, 5000);
});
我有一个 Ajax 请求,我想每 5 秒启动一次以查看进程是否已完成。为此,我尝试使用 setTimout(),但它只是在不考虑超时的情况下一个接一个地启动一个进程。我已经在 SO 上阅读了多个关于此的问题并尝试实现答案,但是我无法让它工作。我必须更改什么才能使其正常工作?
<script type="text/javascript">
$(function() {
$(document).ready(function() {
var user = $('.user-id').text()
var url = '/ajaxurl'
var success = 0
var time = 0
var dataString = 'email='+user;
checkServer(url,user,time,success,dataString);
});
function checkServer(url, user, time, success, dataString) {
setTimeout(
$.ajax({
type: "POST",
url: url,
data: dataString,
success: function(data) {
if (data == 'True') {
success = 1
window.location = "https://www.someurl.com";
}
else {
time++
console.log(time);
console.log(data);
if ((success == 0) && (time < 60)) {
checkServer(url, user, time, success, dataString)
}
}
}
}), 5000);
};
});
</script>
除了@Taplar 的回答之外,我还建议您在创建新超时计时器之前清除超时计时器:
var myTimer = null;
function checkServer(url, user, time, success, dataString) {
clearTimeout( myTimer );
myTimer = setTimeout(
...
否则你将不会总是有 5 秒的延迟,例如 ajax 将比之前的超时回调执行得更快。
尝试将您的 $.ajax() 调用包装在一个函数中 (){}
setTimeout(function(){ $.ajax({ ... })}, 5000);
否则会在编译时立即触发。
如果您希望您的代码在页面打开时每 5 秒 运行,您最好使用 setInterval。如果您想使用一次代码,则只能使用 setTimeout。如果你想在某个变量变成 true/false 时打破间隔,那么你可以使用 clearInterval
对于您的代码:
function checkServer(url, user, time, success, dataString) {
$.ajax({
type: "POST",
url: url,
data: dataString,
success: function(data) {
if (data == 'True') {
success = 1
window.location = "https://www.someurl.com";
}
else {
time++
console.log(time);
console.log(data);
// DEFINE A NOT SUCCESS HERE!
if (false) {
clearInterval(intVal);
}
}
}
});
};
$(document).ready(function() {
var user = $('.user-id').text()
var url = '/ajaxurl'
var success = 0
var time = 0
var dataString = 'email='+user;
var intVal = setInterval(function(){
checkServer(url,user,time,success,dataString);
}, 5000);
});