如何在向服务器发送新的jsonrequest时取消JSON请求

时间:2010-10-22 06:43:44

标签: jquery

当用户在文本框中键入内容时,json会自动完成工作,他会向服务器发出大量请求。如何在jQuery中发出新请求时停止旧请求?

2 个答案:

答案 0 :(得分:3)

我猜你会在json request个对象上触发XMLHttpRequest,或者换句话说,你正在使用.ajax()。您通常可以使用.abort()取消ajax请求。

var xhr = $.ajax({});

// somewhere else
if(xhr)
   xhr.abort();

因为.ajax()返回原始XHR事件,您可以将其存储在某处并中止该请求。 当然,你必须创建一些“请求逻辑”来处理这些东西。例如:

var xhrmanager = function() {
    var requests = [],
        self     = {};

    self.create  = function(params, cb){
        if(typeof params === 'object') {// additional checks here
           var xhr = $.ajax($.extend({
               url:      '/path/script.pl',
               dataType: 'json',
               type:     'GET',
               success:  function(data, status, req){
                    if(typeof cb === 'function')
                       cb.apply(this, [data]);                        
               },
               complete: function(req, status) {
                    var pos = $.inArray(req, requests);

                    if(pos > -1)
                       requests.splice(pos, 1)
               }
           }, params || {}));
        }
    };
    self.clearAll = function(){
        for(var i = 0, len = requests.length; i < len; i++){
           requests[i].abort();
        }
    };

    return self;
};

用法如:

var json_requests = xhrmanager();

json_requests.create({
   data:  'some=data'
}, function(data) {
   // do something
});

json_requests.clearAll();

答案 1 :(得分:0)

第一个基本的尝试是:只为请求做一个小偏移(例如100ms)。因此,每次按下一个键时,您只需要重置计时器。

例如

var timeout;
var textBox = $('#textbox');
textBox.change(function() {
    if (timeout) {
        clearTimeout(timeout);
    }
    var callingMethod = /* insert your method for the request */;
    timeout = setTimeout(callingMethod, 100);
});

第二次尝试将是:请求应该是变量。每次输入请求时,逻辑都会检查变量是否为null(某种:双重锁定模式)。因此,如果变量不为null,则表示正在进行请求。因此,您可以将旧请求存储在可以取消它的变量中。

例如

var request;
function DoMagicThing() {
    if (request) {
        request.abort();
        request = null;
    }

    request = $.ajax({
        /* insert options here */,
        complete = function() {
            request = null;
        }
    });
}
相关问题