Skip to content Skip to sidebar Skip to footer

Check That A Task Is Completed

I have a javascript function which supposed to check whether a task is completed. When the task is completed there is a completion record in a file on the server. The function supp

Solution 1:

You need to pass check_status to setTimeout, not the value returned by invoking check_status(...). Since you need to pass parameters to check_status, use an anonymous function:

 setTimeout(function () {
     check_status(waittime, div_id, filename);
 }, waittime);

Solution 2:

You are calling the function instead of giving it as a reference to setTimeout. Wrap your function call in an anonymous function. Also, it would be better to simply set up the call in the ajax callback if needed rather than using a synchronous call. A synchronous call will tie up your browser.

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 );
          }
        }
      }
    });

}

Solution 3:

"recursive calls to the server"? No, I don't think you want that.

If you go three deep, var max_waittime=11000000; will be created and initialized three times.

Maybe you can set the timeout value for the ajax call (ajax settings) http://api.jquery.com/jQuery.ajax/


Solution 4:

First of all, it looks like you don't understand that the ajax call is an asychronous call. Calling it just starts the networking operation and then the rest of your code continues executing. Some time later when the networking operation completes, your success function is called.

The ONLY place you can operate on the results of the ajax call is in the success function. You can't return a value from the success function and expect that to go anywhere. The only place that goes is somewhere inside the ajax code where it's dropped. If you need to do something with the results of the ajax call, then you need to either do that operation right in the success function or call some other function from the success function and pass it the returned data.

These are the parts of your code that do not work:

  1. There's no point in returning the status value from the success function. It doesn't go anywhere except into the ajax function where the return value is just dropped.
  2. This line of code if (status == 0 && waittime < 20000000){ is not doing what you want. Because the ajax call is asynchronous, the value of status has not yet been set by the ajax call when this line of code runs. Thus, it's ALWAYS 0 so your logic never works. You need to move this logic inside the success handler.
  3. As others have said, your parameters to setTimeout are not right. You have to pass a function to setTimeout, not the results of executing a function.

This is the code I would suggest:

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);
                }
            }
        }
    });
}

Note that all handling of the ajax result is done in the success function and we pass an anonymous function to setTimeout that re-calls check_status after a time delay. This is not actually recursion (as others mentioned) because setTimeout allows check_status to return before it's called again some time later.


Post a Comment for "Check That A Task Is Completed"