2013-04-11 23 views
0

我在我的網站上有一個ajax搜索功能,效果很棒!但是,我發現它可能會導致未使用的httpResquests由於快速打字機。所以我想添加一個計時器來減慢搜索速度。用setTimeout減慢AJAX功能

想到的第一件事是setTimeout,但它不起作用。它似乎工作(暫停搜索)第一次,但顯示結果後,它只是有點回到正常顯示結果第二我的關鍵了。所以,當我發現它不是因爲什麼原因,我轉向了stackoverflow,發現thisthis,但他們基本上做了我所做的。

我在想這可能與AJAX的異步方式有關,也許這個方法在時間實際上到來之前在setTimeout中調用,但是這樣做沒什麼意義。因此,要完全誠實,我不知道發生了什麼,任何洞察力將不勝感激。哦,我用我自己的API我肯定只是看着方法名稱,你會知道他們做了什麼。

function validateNetworkInput() 
{ 
    var query, timer = null; 

    query = getValue("searchNetworkInput"); 

    if(query.length > 0) 
    { 
     clearTimeout(timer); 
     show("searchNetworkWrapper");  
     timer = setTimeout(function(){searchNetworks(query);}, 3000); 
    } 
    else 
    { 
     clearTimeout(timer); 
     hide("searchNetworkWrapper"); 
    } 
} 

...

function searchNetworks(query) 
{ 
    var ajaxObject, params, path; 

    ajaxObject = getAjaxObject(); 
    params = "?q=" + query; 
    path = getInternalPath() + "searchNetworks" + params; 

    ajaxObject.open("GET", path, true); 
    ajaxObject.send(); 

    ajaxObject.onreadystatechange = function() 
    { 
     if(ajaxObject.readyState == 4 && ajaxObject.status == 200) 
     { 
      setInnerHtml("searchNetworkWrapper", ajaxObject.responseText); 
     } 
     else if (ajaxObject.readyState == 4 && ajaxObject.status != 200) 
     { 
      getErrorReport("Error Searching Networks", "search our database for the network you are looking for"); 
     } 
    }; 
} 
+0

您已經標記了這個'jQuery',那麼爲什麼不使用'jQuery.ajax'?它會大大簡化你的生活。 – meagar

+0

標記已移除。對於那個很抱歉。 – gmustudent

回答

1

您的問題是timer是您的本地功能,所以它不會記得老計時器下一次它被調用。您需要一個將在函數調用之間停留的變量。像這樣的東西應該工作:

var validateNetworkInput = (function() { 
    var timer; 
    return function() { 
    var query = getValue("searchNetworkInput"); 

    clearTimeout(timer); 
    if(query.length > 0) { 
     show("searchNetworkWrapper");  
     timer = setTimeout(function(){searchNetworks(query);}, 3000); 
    } else { 
     hide("searchNetworkWrapper"); 
    } 
})(); 
+0

當然!這是尷尬,不能相信我忘了!將接受三個謝謝一噸 – gmustudent