多个ajax仅允许最近通话

时间:2013-05-01 17:32:11

标签: javascript ajax

我有一个输入框,每次按键都有一个ajax请求。所以,如果我输入“name”字样,将会有4个成功的请求。所以我实际上只想要执行的最新请求。所以如果我输入“name”这个词,那么只有一个请求将是最后一个请求。

我也有一个解决方案(这是一个简单的点击方法示例)

JS脚本

var callid = 1;

function ajaxCall (checkval ){
    if(checkval == callid){
        $.ajax({
            type: 'post',
            url: baseurl + "test/call_ajax",
            data: {
                val: "1"
            },
            success: function(data) {
                console.log(data)
            }
        });
    }
}

function call(){
    var send = callid+=1;
    setTimeout( function(){ ajaxCall(send)  } , 500);
}

html脚本

<a href="#" onclick="call()" > Call ajax </a>

这很完美。但我认为如果有办法进一步完善它。

任何想法:)

3 个答案:

答案 0 :(得分:4)

我相信你正在为事件调度寻找一些更好的意图技术。

var eventDispatcher = null;
$('.textbox').keyup(function(){
   if(eventDispatcher) clearTimeout(eventDispatcher);
   eventDispatcher = setTimeout(function(){
       $.ajax({ ... });
   }, 300);
});

答案 1 :(得分:3)

你可以在setTimeout中做你的ajax。因此,您无需声明和检查其他变量或编写其他函数,如call()

$(document).ready(function () {
    var timer;
    $('#fillMe').keypress(function () {
        clearTimeout(timer);
        timer = setTimeout(function () {
            //replace this with your ajax call
            var content = $('#fillMe').val();
            $('#result').text('You will only see this if the user stopped typing: ' + content);
        }, 1000); // waits 1s before getting executed
    });
});

<input type="text" id="fillMe">
<div id="result"></div>

在每个按键事件中,这会清除超时并立即创建新的超时。这意味着只有当用户停止键入至少1秒钟时才会执行setTimeout函数的内容。 当然,1秒只是示例目的的值。您可以将其更改为您想要的任何内容,或者认为这是一个美好的时光(如500毫秒)

查看我的jsfiddle

答案 2 :(得分:1)

setTimeout返回一个id,您可以存储并使用它来清除以前设置的计时器:

var timerId;

function call() {
    if (timerId !== undefined) {
        clearTimeout(timerId);  
    } 

    timerId = setTimeout( function() { ajaxCall(send) }, 500);
}

结果应该是在输入最后一个字母后500ms调用ajaxCall方法。