2

正如标题所说,我想中止之前的 ajax 请求。每当用户输入字母(或数字)时,组合框通过 ajax 请求它请求数据,就像我通过 ajax 所说的那样,然后将数据返回给组合框。

我的问题是,每当我在字段中输入用户输入时,ajax 请求就会堆积起来。

我想要做的是首先中止先前的请求,然后继续执行当前请求。我试过这段代码:

  comboObj.onTypeAhead = Ext.Function.createInterceptor(comboObj.onTypeAhead, function() {
     Ext.Ajax.abort(); //aborts the last Ajax request
     return true; //runs the onTypeAhead function
  });

那没用,然后尝试了这个:

  ......
  listeners: {
        beforequery: function(evt){
           Ext.Ajax.abortAll(); //cancel any previous requests
           return true;
        }
     }

这对我也不起作用,因为我有一个也使用 ajax 请求的计时器,如果执行了侦听器,它也会被取消。

我该怎么做呢?

4

2 回答 2

6

我花了很长时间才弄清楚。Ext.Ajax.abort(request) 能够中止请求。但是很难从存储中获取当前的请求对象(或者更好的是,Ext.Ajax.abort 需要的请求对象)。

最后我得到了这个:

...
if (store.loading && store.lastOperation) {
  var requests = Ext.Ajax.requests;
  for (id in requests)
    if (requests.hasOwnProperty(id) && requests[id].options == store.lastOperation.request) {
      Ext.Ajax.abort(requests[id]);
    }
}
store.on('beforeload', function(store, operation) {
  store.lastOperation = operation;
}, this, { single: true });

store.load();
...

不好,但持久的存储负载被可靠地取消。

于 2013-03-12T14:01:03.510 回答
1
store.on('beforeload', function(store, operation) {
    store.lastOperation = operation;
    if (store.loading && store.lastOperation) {
        Ext.Ajax.abort(store.lastOperation.request);
    }
});
于 2016-07-19T14:45:52.260 回答