我有一个javascript函数,它应该检查任务是否完成。 任务完成后,服务器上的文件中有完成记录。 该函数应该以一些延迟(可能增加)对服务器进行递归调用,直到它获得文件中的完成记录。 下面给出的代码会在间隔小于一秒的情况下对服务器进行过多调用 Web控制台的示例: [20:06:21.202] [20:06:21.563] [20:06:21.990] 但是,任务变得竞争变量等待时间值等于 max_waittime 。 虽然对于测试用例,整体输出与预期一致,但该功能有问题。 哪里我错了?
function check_status(time,div_id,filename) {
var status =0;
var waittime=time;
var max_waittime=11000000;
if (waittime < max_waittime){waittime=waittime+1000000; }
$.ajax({
type: "GET",
async: false,
url: "code_on_server_checking_file.php",
data: "f="+filename,
dataType: "text",
success: function(content) {
if (content ) {
// stuff related to output of the result
....
return status=1;
}
else {return status=0;}
}
});
if (status == 0 && waittime < 20000000){
setTimeout(check_status(waittime,div_id,filename),waittime);
}
else {alert('check_status passed!'+status+'|'+waittime);}
}
答案 0 :(得分:1)
您需要将check_status
传递给setTimeout
,而不是通过调用check_status(...)
返回的值。由于您需要将参数传递给check_status
,请使用匿名函数:
setTimeout(function () {
check_status(waittime, div_id, filename);
}, waittime);
答案 1 :(得分:0)
您正在调用该函数,而不是将其作为对setTimeout的引用。将函数调用包装在匿名函数中。此外,如果需要,最好只在ajax回调中设置调用,而不是使用同步调用。同步通话将占用您的浏览器。
function check_status(time,div_id,filename) {
$.ajax({
type: "GET",
url: "code_on_server_checking_file.php",
data: "f="+filename,
dataType: "text",
success: function(content) {
if (content ) {
// stuff related to output of the result
}
else {
time += 1000000;
if (time < 20000000) {
setTimeout( function() { check_status( time, div_id, filename); }, time );
}
}
}
});
}
答案 2 :(得分:0)
“递归调用服务器”?不,我认为你不想要那个。
如果你去三深,var max_waittime = 11000000;将被创建并初始化三次。
也许你可以设置ajax调用的超时值(ajax设置) http://api.jquery.com/jQuery.ajax/
答案 3 :(得分:0)
首先,看起来您不明白ajax调用是异步调用。调用它只是启动网络操作,然后其余代码继续执行。一段时间后,当网络操作完成时,将调用您的成功函数。
您可以对ajax调用的结果进行操作的唯一位置是成功函数。您无法从成功函数返回一个值,并期望它可以去任何地方。唯一的地方就是ajax代码中的某个地方。如果你需要对ajax调用的结果做一些事情,那么你需要在success函数中执行该操作,或者从success函数调用其他函数并将其传递给返回的数据。
这些是您的代码中不起作用的部分:
if (status == 0 && waittime < 20000000){
没有按照您的意愿行事。因为ajax调用是异步的,所以当这行代码运行时,ajax调用尚未设置status的值。因此,它始终为0,因此您的逻辑永远不会起作用。您需要在成功处理程序中移动此逻辑。setTimeout
的参数不正确。您必须将函数传递给setTimeout,而不是执行函数的结果。这是我建议的代码:
function check_status(time, div_id, filename) {
var max_waittime=11000000;
if (time < max_waittime){
time=time+1000000;
}
$.ajax({
type: "GET",
async: false,
url: "code_on_server_checking_file.php",
data: "f="+filename,
dataType: "text",
success: function(content) {
if (content ) {
// stuff related to output of the result
if (time < 20000000){
setTimeout(function() {check_status(time, div_id, filename)}, time);
}
}
}
});
}
请注意,ajax结果的所有处理都在success函数中完成,我们将一个匿名函数传递给setTimeout,该函数在一段时间延迟后重新调用check_status。这实际上不是递归(正如其他人提到的那样),因为setTimeout允许check_status在稍后再次调用之前返回。