jquery – 使用setTimeout定期进行自动完成的AJAX调用?

我想使用setTimeout函数,以便Ajax调用最多每1秒进行一次.

这就是我所拥有的.这显然不正确,但我不确定setTimeout函数是如何工作的.

function autoComplete(q,succ)
{

    setTimeout(

    if(q != "") {
        $.ajax({type:"GET",url: "PHP/search.PHP",data: "q="+q,success: succ
        });
    },1000);
}

我认为我应该使用clearTimeout,以便如果进行另一次调用,它将重置计时器并等待另一个1秒,但是当我尝试实现它时,它停止运行该函数.

解决方法

通过…功能:)

使用匿名函数可能如下:

var timeoutId
function autoComplete(q,succ)
{
    if (q) {
        // stop prevIoUs timeouts
        clearTimeout(timeoutId)
        timeoutId = setTimeout(function () {
            $.ajax({type:"GET",success: succ
            });
         },1000);
    }
}

注意我在外面移动q的支票.这不会同时运行两次超时,但可能会有多个正在进行的请求.为了防范这种情况,成功的回调需要一个警卫 – 一个简单的方法就是使用一个计数器.使用setTimeout中的q检查“当前q”可能会导致细微的竞争条件.

var timeoutId
var counter = 0
function autoComplete(q,succ)
{
    if (q) {
        // Increment counter to maintain separate versions
        counter++
        var thisCounter = counter
        clearTimeout(timeoutId)
        timeoutId = setTimeout(function () {
            $.ajax({type:"GET",success: function () {
                    // Only call success if this is the "latest"
                    if (counter == thisCounter) {
                       succ.apply(this,arguments)
                    }
                },});
         },1000);
    }
}

更智能的版本可能会在提交时读取当前值,因为上面的代码总是落后一秒……

现在,假设getQ是一个函数对象……

var timeoutId
var counter = 0
function autoComplete(getQ,succ)
{
    counter++
    var thisCounter = counter
    clearTimeout(timeoutId)
    timeoutId = setTimeout(function () {
        var q = getQ() // get the q ... Now
        if (q) {
            $.ajax({type:"GET",success: function () {
                    if (counter == thisCounter) {
                       succ.apply(this,});
         }
     },1000);
}

// example usage
autoComplete(function () { return $(elm).val() },successCallback)

快乐的编码.

需要考虑的一点是,上面没有解决的问题是,可能仍有多个飞行中的请求(第二个示例中的警卫只显示如何“抛弃”旧的响应,而不是如何适当地限制请求).这可以通过短队列处理并防止提交新的AJAX请求,直到获得答复或足够的“超时”已到期并且该请求被视为无效.

相关文章

页面搜索关键词突出 // 页面搜索关键词突出 $(function () {...
jQuery实时显示日期、时间 html: <span id=&quot...
jQuery 添加水印 <script src="../../../.....
中文:Sys.WebForms.PageRequestManagerParserErrorExceptio...
1. 用Response.Write方法 代码如下: Response.Write(&q...
Jquery实现按钮点击遮罩加载,处理完后恢复 思路: 1.点击按...