出于某种原因,我在网站上制作的ajax请求中止了一半的时间。当我为ajax请求设置超时时,会解决此问题,如下所示。
$.ajax({
url: "/question/why_wont_it_work",
timeout : 1000,
success: function(){ /*do stuff*/ }
});
可悲的是,超时修复似乎不适用于jquery自动完成。我正在使用它:
$( "#questionTags" ).autocomplete({
source: "/question/tags",
timeout: 1000,
select: function(event, ui) { /*do stuff*/ },
});
我检查了网站上的jQueryUI文档,但也没有看到超时选项。现在这很烦人,因为有一半时间我的请求会中止,我不会得到结果 我想要。有没有解决的办法?
提前致谢。
答案 0 :(得分:7)
您可以为source
参数提供任意函数。因此,您可以手动发出AJAX请求并指定timeout
选项:
var xhr = null; /* To prevent multiple calls from happening while one is in progress */
$("#questionTags").autocomplete({
source: function (request, response) {
if (!xhr) {
xhr = $.ajax({
url: "/question/tags",
timeout: 20000,
data: request,
dataType: "json",
success: function (data) {
xhr = null;
response(data);
},
error: function () {
response([]);
}
});
}
},
select: function(event, ui) { /*do stuff*/ },
});
但我在@El Ronnoco,你可能想要认真加快你的要求。 20秒是很长的等待时间。
答案 1 :(得分:4)
如果source
是一个字符串,jQuery自动完成会执行下面显示的代码来加载数据,因此它不会设置超时。
您可以使用ajaxSetup这样全局设置超时:
$.ajaxSetup({
timeout: 20000,
});
但这会影响你所有的ajax请求。
来自jquery.ui.autocomplete.js的代码:: _initSource
self.xhr = $.ajax({
url: url,
data: request,
dataType: "json",
context: {
autocompleteRequest: ++requestIndex
},
success: function( data, status ) {
if ( this.autocompleteRequest === requestIndex ) {
response( data );
}
},
error: function() {
if ( this.autocompleteRequest === requestIndex ) {
response( [] );
}
}
});
答案 2 :(得分:-1)
$target.autocomplete('/question/why_wont_it_work',{
delay: 2000
});