2012-06-27 93 views
5
$(document).ready(function() { 
    (function poll() { 
     setTimeout(function() { 
      $.ajax({ 
       url: "/project1/api/getAllUsers", 
       type: "GET", 
       success: function(data) { 
        console.log("polling"); 
       }, 
       dataType: "json", 
       complete: poll, 
       timeout: 5000 
      }), 5000 
     }); 
    })(); 
});​ 

這只是執行儘可能快的服務器可以響應,但我希望它只會每5秒輪詢一次。有什麼建議麼?jQuery遞歸Ajax輪詢使用setTimeout來控制輪詢間隔

編輯:我應該補充,5秒後,請求已經完成將是更可取的。

+0

它似乎在前一個完成後5秒執行下一個AJAX輪詢。那你想改變什麼?最好的我可以理解你的問題,那就是你想要的。 –

+0

@Richard Neil Ilagan:我希望它大概每5秒執行一次(在完成ajax請求後5秒內也沒問題,我被告知,更好的練習),但我觀察到請求執行得更快,如果它忽略了5秒的延遲。 – chrisjleu

+0

對不起,剛出去吃晚飯。再看一下,發現你看起來錯了。在下面彈出一個答案。 –

回答

6

看來你已經設法讓你的setTimeout延遲參數寫在錯誤的地方。

$(document).ready(function() { 
    (function poll() { 
    setTimeout(function() { 
     $.ajax({ 
      url: "/project1/api/getAllUsers", 
      type: "GET", 
      success: function(data) { 
       console.log("polling"); 
      }, 
      dataType: "json", 
      complete: poll, 
      timeout: 5000 
     }) //, 5000 <-- oops. 
    }, 5000); // <-- should be here instead 
    })(); 
});​ 

如果按照大括號,你會看到,我們在調用setTimeout像:

setTimeout(function() { 
    $.ajax(), 5000 
}) 

,並應

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

這應該叫AJAX調查5秒在前一個完成之後。

+0

是的,這是愚蠢的錯誤。謝謝。 – chrisjleu

+1

不錯,我會說。發生在我們身上。祝你好運。 :) –

1

如果應該在完成最後一次請求後每隔5秒輪詢一次並且不一定5秒,那麼可以使用setInterval。不知道這是否可以接受,但它會使遞歸不必要。

function poll() { 

      $.ajax({ 
       url: "/project1/api/getAllUsers", 
       type: "GET", 
       success: function(data) { 
        console.log("polling"); 
       }, 
       dataType: "json" 
     }); 
    } 

setInterval(poll, 5000); 
0

因爲你想使用jQuery的promise語法,而不是回調語法,這裏有另一種整潔的方法。

function poll() { 
    $.get('http://your-api-endpoint.com') 
    .done(function() { 
     // 200 - OK response 
    }) 
    .fail(function() { 
     // Error Response 
    }) 
    .always(function() { 
     setTimeout(function() { 
      poll(); 
     }, 5000); 
    }); 
} 

poll();