2012-02-19 38 views
9

Tôi đang cố gắng sử dụng setTimeout để kiểm tra xem dữ liệu có tồn tại trong một bảng không:bằng cách sử dụng SetTimeout với các cuộc gọi Ajax

Nếu dữ liệu tồn tại không tìm nạp dữ liệu. Nếu dữ liệu không tồn tại tìm nạp dữ liệu bằng cách sử dụng tải và sau đó làm điều tương tự mỗi x phút.

Đây là những gì tôi có cho đến nay. Vì lý do nào đó, setTimeout không hoạt động khi nó chạm vào khối If.

Tôi thậm chí không chắc chắn nếu đây là cách tốt nhất để làm điều này.

var sTimeOut = setTimeout(function() { 
     $.ajax({ 
      url: 'CheckIfDataExists/' + 
         new Date().getTime(), 
      success: function (response) { 
       if (response == 'True') { 
        $('.DataDiv') 
         .load('GetFreshData/' + new Date() 
          .getTime(), { "Id": $("#RowID").val() }); 
       } 
      }, 
      complete: function() { 
       clearTimeout(sTimeOut); 
      } 
     }); 
    }, 10000); 

Mọi trợ giúp sẽ được đánh giá cao.

Cập nhật ...

setTimeout(function(){checkData()}, 5000); 
    function checkData(){ 
    $.ajax({ 
      url: 'CheckIfDataExists/' + 
          new Date().getTime(), 
      success: function (response) { 
       if (response == 'True') {      
        $('.DataDiv') 
          .load('GetFreshData/' + new Date() 
           .getTime(), { "Id": $("#RowID").val() }); 
       } else { 
        $('.OutOfWindow').html('No Data Found'); 
        setTimeout(function() { checkData() }, 5000); 
       } 
      }, 
      complete: function() { 
       // clearTimeout(sTimeOut); 
      } 
     }); 
    } 
+0

Bạn đã [đã kiểm tra debugger của bạn] (http://blog.niftysnippets.org /2011/03/no-excuse.html) để xem có gì sai? JS có vẻ hoàn toàn ổn: http://jsfiddle.net/FgT22/ – gideon

+0

Có. Nó hoạt động tốt. Nó hoạt động như mong đợi khi không có dữ liệu trong cơ sở dữ liệu (đó là khi phản hồi là đúng). Khi nó sai, tôi muốn kiểm tra lại sau x phút. Đó là nơi mà vấn đề dường như là. Nó không kiểm tra lại. Ida của tôi thanh toán bù trừ thời gian chờ thành công là như vậy kiểm tra tiếp theo không nên được bắn trước khi tải trước đó là hoàn thành – mkizito76

+0

Đây là những gì tôi có bây giờ và nó có vẻ làm việc. Đây có phải là cách tốt nhất để làm điều này? Nhân tiện, cảm ơn bạn đã giúp đỡ – mkizito76

Trả lời

16

Something như thế này nên làm việc, đoạn đầu tiên được bản địa hoá vì vậy tôi có thể kiểm tra chạy nó. Tôi đã giải thích đoạn code dưới đây và nó là gì mã của bạn nên

Giống như bạn nhận ra (từ bản cập nhật của bạn về bài của bạn) setTimeout chỉ gọi chức năng mục tiêu của bạn lần, vì vậy để liên tục kiểm tra bạn cần phải gọi nó một lần nữa nếu bạn làm một kiểm tra thất bại.

Xem nó trên JsFiddle: http://jsfiddle.net/jQxbK/

//we store out timerIdhere 
var timeOutId = 0; 
//we define our function and STORE it in a var 
var ajaxFn = function() { 
     $.ajax({ 
      url: '/echo/html/', 
      success: function (response) { 
       if (response == 'True') {//YAYA 
        clearTimeout(timeOutId);//stop the timeout 
       } else {//Fail check? 
        timeOutId = setTimeout(ajaxFn, 10000);//set the timeout again 
        console.log("call");//check if this is running 
        //you should see this on jsfiddle 
        // since the response there is just an empty string 
       } 
      } 
     }); 
} 
ajaxFn();//we CALL the function we stored 
//or you wanna wait 10 secs before your first call? 
//use THIS line instead 
timeOutId = setTimeout(ajaxFn, 10000); 

Mã của bạn sẽ trông như thế này:

var timeOutId = 0; 
var ajaxFn = function() { 
     $.ajax({ 
      url: 'CheckIfDataExists/' + new Date().getTime(), 
      success: function (response) { 
       if (response == 'True') { 
        $('.DataDiv'). 
        load('GetFreshData/' + new Date(). 
          getTime(), { "Id": $("#RowID").val() }); 
        clearTimeout(timeOutId); 
       } else { 
        timeOutId = setTimeout(ajaxFn, 10000); 
        console.log("call"); 
       } 
      } 
      }); 
} 
ajaxFn(); 
//OR use BELOW line to wait 10 secs before first call 
timeOutId = setTimeout(ajaxFn, 10000); 
+0

Chà, thật tuyệt vời! Cảm ơn bạn rất nhiều vì sự giúp đỡ. Một điều nữa, khi sự kiện tải cháy ajaxFn bị phạt ngay lập tức. Tôi muốn có một sự chờ đợi (nói 10 giây) trước khi vụ cháy ajaxFn (kể từ khi tải có thể mất đôi khi). Nói cách khác, tôi muốn đợi 10 giây trước khi tôi bắn ajaxFn. Điều đó có thể không? – mkizito76

+0

@ user1219415 Bạn có nghĩa là bạn muốn đợi 10 giây trước cuộc gọi FIRST? Tôi đã cập nhật câu trả lời. – gideon

+0

FANTASTIC! Cảm ơn một lần nữa – mkizito76

Các vấn đề liên quan