2011-12-04 67 views
2

我有一個JavaScript函數應該檢查任務是否完成。 當任務完成時,服務器上的文件中會有一個完成記錄。 該函數應該使服務器有一些延遲(可能增加)遞歸調用,直到它獲得文件中的完成記錄。 下面給出的代碼使過度調用以從Web控制檯與間隔小於第二 例的服務器: [20:06:21.202] [20:06:21.563] [20:06:21.990] 但是任務變得競爭了可變WAITTIME值變得等於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

您調用的函數,而不是給它作爲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); 
      } 
     } 
     } 
    }); 

} 
+0

關於'async'調用的好處。我錯過了。 –

1

你需要傳遞check_statussetTimeout,而不是通過調用check_status(...)返回的值。既然你需要傳遞參數給check_status,可以使用匿名函數:

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

「遞歸調用服務器」?不,我不認爲你想要那樣。

如果你繼續深,VAR max_waittime = 11000000;將被創建並初始化三次。

也許你可以設置Ajax調用的超時值(AJAX設置) http://api.jquery.com/jQuery.ajax/

0

首先,它看起來像你不明白,Ajax調用是臺異步調用。調用它只是開始聯網操作,然後代碼的其餘部分繼續執行。一段時間後,網絡操作完成後,您的成功功能被調用。

您可以在AJAX調用的結果操作的唯一地方是事業成功的功能。你不能從成功函數中返回一個值,並期望它可以去任何地方。唯一的地方是在ajax代碼裏面的地方。如果您需要對ajax調用的結果做些什麼,那麼您需要在成功函數中執行該操作,或者從成功函數調用其他函數並將返回的數據傳遞給它。

這是你的代碼不工作的部分:

  1. 有從成功函數返回的狀態值是沒有意義的。除了進入ajax函數,其中的返回值剛剛被刪除之外,它不會去任何地方。
  2. 的代碼if (status == 0 && waittime < 20000000){此行是不是做你想要什麼。因爲ajax調用是異步的,所以在這行代碼運行時,狀態值尚未由ajax調用設置。因此,它總是0,所以你的邏輯從不起作用。您需要在成功處理程序中移動此邏輯。
  3. 正如其他人所說,您的參數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結果的所有操作在成功函數完成,我們通過一個匿名函數setTimeout的後一個是重來電check_status時間延遲。這實際上不是遞歸(正如其他人提到的),因爲setTimeout允許check_status在稍後再次調用之前返回。