我有这样的twitter typeahead.js设置:
var filteredSource = new Bloodhound({
datumTokenizer: Bloodhound.tokenizers.obj.whitespace('value'),
queryTokenizer: Bloodhound.tokenizers.whitespace,
remote: {
url: '@Url.Action("Get", "Search")/',
prepare: function (query, settings) {
settings.url = settings.url + $('#filter-select').val() + '?q=' + encodeURIComponent(query);
return settings;
},
rateLimitBy: 'throttle',
rateLimitWait: 800
}
});
$('#search').typeahead({
hint: false,
highlight: true,
minLength: 3
}, {
name: 'filtered-source',
display: 'value',
limit: 50,
source: filteredSource,
templates: {
empty: [
'<div>',
' Unable to find any results.',
'</div>'
].join('\n'),
suggestion: Handlebars.compile(templateData)
}
});
当用户进行搜索并开始输入类似&#34; key&#34;并暂停,搜索请求正由bloodhound发送到服务器。当用户然后在输入字段中添加字母时,会向服务器发送另一个搜索,例如&#34; keyword&#34;。
但待处理的请求&#34; key&#34;首先等待浏览器完成,然后服务器处理第二个请求,并且只有在完成后才会显示结果。
因此,在用户看到任何结果之前可能需要很长时间。
当关键字发生变化时,有没有办法通过猎犬取消待处理的请求?
答案 0 :(得分:2)
你可以使用 abort()这样的功能:
var lastSearch;
var filteredSource = new Bloodhound({
datumTokenizer: Bloodhound.tokenizers.obj.whitespace('value'),
queryTokenizer: Bloodhound.tokenizers.whitespace,
remote: {
url: '@Url.Action("Get", "Search")/',
prepare: function (query, settings) {
settings.url = settings.url + $('#filter-select').val() + '?q=' + encodeURIComponent(query);
settings.beforeSend = function(e) {
if (lastSearch) {
lastSearch.abort();
}
lastSearch = e;
};
return settings;
},
rateLimitBy: 'throttle',
rateLimitWait: 800
}
});
这将取消最后一次完成的AJAX请求,但重要的是要注意中止功能并不总是阻止请求到达服务器。如果在调用abort()之前请求到达服务器,则服务器可以继续处理请求。