2016-04-28 74 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); 
 
     } 
 
    }); 
 
}