2010-12-14 19 views
2

我正在使用jQuery UI自动完成来构建搜索界面。jQuery UI自动完成:你如何启动一个异步过程,并在它完成之前退出

我定义了一个自定义函数,它返回搜索结果并在按下按键时自动更新它们,但有时这个自定义函数在按下下一个按键之前没有完成(例如,当我已经处理了“Wash”写“Washi”(在写作“华盛顿”的路上)

我希望每次调用自动完成“源”事件来取消上一个函数(Wash)并启动新函数(Washi)。下一个通话取消功能(Washi)和启动功能(Washin)等。

这种事情是怎么完成的?

回答

3

你应该能够做这样的事情:

var lastXhr; 
$("#myAutocomplete").autocomplete({ 
    source: function(request, response) { 
     if (lastXhr) lastXhr.abort(); 
     lastXhr = $.getJSON("search.php", request, function(data, status, xhr) { 
      if (xhr === lastXhr) { 
       response(data); 
      } 
     }); 
    } 
}); 

lastXhr VAR存储最新XHR请求。如果有一个集合,并且调用了源函数,那么它会中止上一个Xhr请求并创建一个新的请求。当ajax请求返回时,如果确定它匹配lastXhr,如果不是,那么它不会调用response()函数。

+0

是否有办法包装一个任意的函数/对象,以便它有一个abort()方法并以非阻塞的方式运行?或者这个技巧仅适用于$ .getJSON包装器? – tjb 2010-12-14 15:24:16

+0

@tjb中止对于ajax请求是特殊的。 – PetersenDidIt 2010-12-14 15:48:46

+0

彼得森,我认为你的答案是正确的,我接受它。但是,这是否会起作用:我写URL是因为我知道的东西总是会成功,然后我写了一个函数,它与返回的数据无关,但有其他用处。在那种情况下,我可以放弃(即使函数被阻塞),并且以这种方式通过任意函数获得上述功能? – tjb 2010-12-15 09:46:09