检查任务是否完成

时间:2011-12-04 04:44:48

标签: javascript ajax

我有一个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);}
}

4 个答案:

答案 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函数调用其他函数并将其传递给返回的数据。

这些是您的代码中不起作用的部分:

  1. 从成功函数返回状态值没有意义。除了进入刚刚丢弃返回值的ajax函数之外,它不会去任何地方。
  2. 这行代码if (status == 0 && waittime < 20000000){没有按照您的意愿行事。因为ajax调用是异步的,所以当这行代码运行时,ajax调用尚未设置status的值。因此,它始终为0,因此您的逻辑永远不会起作用。您需要在成功处理程序中移动此逻辑。
  3. 正如其他人所说,setTimeout的参数不正确。您必须将函数传递给setTimeout,而不是执行函数的结果。
  4. 这是我建议的代码:

    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在稍后再次调用之前返回。