我有一个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>
答案 0 :(得分:3)
尝试在函数(){}
中包装$ .ajax()调用setTimeout(function(){ $.ajax({ ... })}, 5000);
否则会在编译时立即触发。
答案 1 :(得分:1)
除了@Taplar的答案,我建议您在创建新的计时器之前清除超时计时器:
var myTimer = null;
function checkServer(url, user, time, success, dataString) {
clearTimeout( myTimer );
myTimer = setTimeout(
...
否则,如果例如ajax执行速度比之前的超时回调更快,则不会总是有5秒的延迟。
答案 2 :(得分:1)
如果您希望代码在页面打开时每5秒运行一次,那么最好使用setInterval。如果要使用一次代码,则只能使用setTimeout。如果你想要在一些变量变为真/假的情况下打破你的间隔,那么你可以使用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);
});