在Twitter typeahead.js中取消待处理的猎犬请求

时间:2015-11-16 14:59:24

标签: javascript twitter typeahead.js bloodhound

我有这样的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>',
            '&nbsp;&nbsp;Unable to find any results.',
            '</div>'
        ].join('\n'),
        suggestion: Handlebars.compile(templateData)
    }
});

当用户进行搜索并开始输入类似&#34; key&#34;并暂停,搜索请求正由bloodhound发送到服务器。当用户然后在输入字段中添加字母时,会向服务器发送另一个搜索,例如&#34; keyword&#34;。

但待处理的请求&#34; key&#34;首先等待浏览器完成,然后服务器处理第二个请求,并且只有在完成后才会显示结果。

因此,在用户看到任何结果之前可能需要很长时间。

当关键字发生变化时,有没有办法通过猎犬取消待处理的请求?

1 个答案:

答案 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()之前请求到达服务器,则服务器可以继续处理请求。