2013-11-03 103 views
0

我有一個Ajax請求等待來自另一個進程的響應。jQuery的睡眠不執行AJAX請求

function test() { 
    var flag = 0; 
    while (flag === 0) { 
     $.ajax({ 
      url: "cs/CheckForProcess", 
      async: false, 
      success: function(data) { 
       if (data !== 'NotReady') { 
        $('#results').html(data); 
        flag = 1; 
       } else { 
        $('#results').html('<h1>Processing...</h1>'); 
        setTimeout(function() { 
        }, 6000); 
       } 
      } 
     }); 
    } 
} 

問題是setTimout不工作,雖然我看到在調試模式下執行else條件。


編輯: 我想下一AJAX請求到驗證過程之後發送僅6秒是沒有準備好。

我失蹤了什麼? Thx。

+0

有沒有在你的'setTimeout'功能。你想在那裏做什麼? – putvande

+0

只是睡覺....是不是睡覺的標準語法? –

+0

setTimeout是一個異步函數。它不會暫停您的腳本。您的腳本將繼續運行(6000毫秒後您的setTimeout回調函數將會執行 – jaredrada

回答

5

setTimeout是一個異步函數。它不會暫停您的腳本。你的腳本將繼續運行(6000毫秒後你的setTimeout回調函數將會執行)。

你可以考慮使用setInterval來檢查你的其他條件是否爲真。

您可以通過跟蹤其他地方的服務器響應來刪除異步:false。一旦你有一個成功的回調,那麼你應該取消間隔。

function test() { 
    var timerId = 0, 
    timerId = setInterval(function(){ 
     $.ajax({ 
      url: "cs/CheckForProcess", 
      success: function(data) { 
       if (data !== 'NotReady') { 
        $('#results').html(data); 
        clearInterval(timerId); 
       } 
      } 
     }); 
    }, 6000) 
} 
+0

您能解釋爲什麼要清除「else」語句? –

+0

對不起,我已經更新了我的回答。 – jaredrada

+0

hmmm在哪裏看不到解釋?thx。 –

2

使用setTimeout,Javascript無法睡眠(例如暫停或阻止javascript執行)。

A setTimeout()安排將來某個時間運行的功能,其他javascript只是在此期間繼續運行。

如果數據尚未準備好,您應該使用setTimeout()安排下一次運行ajax函數。所以,當沒有數據準備好的時候,你從現在開始計劃下一個ajax調用6秒鐘,但是當你獲得數據時,你只需處理數據就完成了。

此外,您確實不希望使用async: false,因爲這會在ajax調用期間凍結瀏覽器(不允許進行任何其他處理)。可以編寫相同的操作來利用ajax的異步特性,並允許您仍然解決您的問題,但允許在瀏覽器中繼續執行其他處理而不阻止瀏覽器。這需要異步編程技術。

你可以這樣做是這樣的:

function test() { 

    function runIt() { 
     $.ajax({ 
      url: "cs/CheckForProcess", 
      async: true, 
      success: function(data) { 
       if (data !== 'NotReady') { 
        $('#results').html(data); 
       } else { 
        // if data not ready yet, then put up some progress 
        // and call this again in 6 seconds 
        $('#results').html('<h1>Processing...</h1>'); 
        setTimeout(runIt, 6000); 
       } 
      } 
     }); 
    } 

    // start the first iteration 
    runIt(); 
} 
+0

爲什麼downvote?這似乎是OP正在尋找的東西。 – jfriend00

+0

不鼓勵使用aysnc:false,因爲它可能會阻止瀏覽器。 – jaredrada

+0

@porfuse - 這只是一個錯誤。我從來沒有打算這樣做(只是從OP的代碼複製,甚至沒有看到它)。我將它改爲'async:true',因爲這就是我寫的代碼和我一直想要的。 – jfriend00

0

setTimeout功能需要一個function超時後執行。您正在傳遞一個空函數。所以,在6秒後,這個空功能正在執行 - 顯然沒有做任何事情。

我認爲你期待setTimeout推遲在你的頁面上執行其他腳本。情況並非如此,因爲setTimeout延遲並在新線程中執行提供的回調function(不阻止頁面上的其他執行)。

如果您在6秒後嘗試做某些事情,只需提供function() {}代碼即可。例如:

setTimeout(function() { 
    $.ajax(...); 
}, 6000); 

setTimeout(runIt, 6000); 

鏈接:
setTimeout documentation (mozilla)
Related SO question