2016-04-28 80 views
3

我想每5秒鐘用ajax調用更新視圖。我以下面的方式完成了它。如何停止點擊運行超時jquery函數並運行新函數?

function getData(a, b, c) { 
    $.ajax({ 
     url  : 'url', 
     success : function(data) { 
      $("#result").html(data); 
      setTimeout(getData, 5000, a, b, c); 
     } 
    }) 
} 

$(document).ready(function() { 
    getData(1, 2, 3);  
}); 

$('.btn').click(function(){ 
    getData(4,5,6); 
}); 

但是,通過這種方式儘可能多的功能正在運行儘可能多的點擊。

我需要停止前一個並運行新的或更改運行功能的參數。

+0

使用'clearTimeout()'停止你的setTimeout函數的執行.. –

+0

我試着這但不能捕捉正在運行的事件。 clearTimeout(???) – CoderBoy

+0

您可以在ajax調用中設置更多參數。 'async:false'。它會逐一打出每個電話。 – Ali

回答

2

使用Ajax abort()功能停止請求按鈕被點擊時,開始一個新的...

在這裏我有一個例子給你,如何中止工程...看看代碼,並嘗試這個...

<script> 

var prev_request = false; 
var xhr; 
var myTimeoutReq; 
//var myCondition = true, 

function getData(a, b,c,myCondition) 
{ 
    if(prev_request == true) 
    { 
     xhr.abort(); 
    } 

    xhr = $.ajax({ 
       url  : 'url', 
       beforeSend: function(xhr) { 
        prev_request = true; 
       }, 
       success : function(data) { 
        $("#result").html(data); 
        if(myCondition == true) 
        { 
         myTimeoutReq = setTimeout(getData, 5000, a, b, c,true); 
        } 
        else 
        { 
         clearTimeout(myTimeoutReq); 
        } 
       }, 
       complete: function(xhr) { 
        prev_request = false; 
       } 
      }); 
} 

$(document).ready(function() { 
    getData(1, 2, 3, true);  
}); 

$('.btn').click(function(){ 
    getData(4,5,6,false); 
}); 
</script> 
+0

不知道爲什麼,但prev_request始終保持爲false,這就是爲什麼getData(1,2,3),getData(4,5,6),....都在運行 – CoderBoy

+0

您的ajax只會被中止,如果您以前請求正在運行......因爲在完成ajax時,我們已經設置了prev_request來處理,prev_request只有在第一個請求正在運行時才爲真... –

+0

它每5秒鐘就會保持一次ajax請求。我需要完全中止先前的按鈕點擊請求。 – CoderBoy

2

您需要使用clearTimeout才能完成先前的超時,因爲您需要先指定返回的對象setTimeout。聲明一個全局對象來分配超時對象,以便可以通過其他函數進行評估。

指定超時對象

someGlobalTimeoutObject = setTimeout(getData, 5000, a, b, c); 

結算超時對象

clearTimeout(someGlobalTimeoutObject); 
+0

var myObj = setTimeout(getData,5000,a,b,c); 我正在使用這個,但在點擊功能console.log(myObj)說myObj是undefined – CoderBoy

+0

定義它以外的getData使其成爲全球,那麼你將能夠在其他功能訪問。一旦你在全球定義它,不要在getData中使用var,因爲它是一個新的本地對象。 – Adil

1

function getData(a, b, c) { 
 
    if(detData.ajax) { 
 
     detData.ajax.abort(); 
 
     clearTimeout(getData); 
 
    } 
 
    detData.ajax = $.ajax({ 
 
     url  : 'url', 
 
     success : function(data) { 
 
      $("#result").html(data); 
 
      setTimeout(getData, 5000, a, b, c); 
 
     } 
 
    }); 
 
}