Javascript 在Twitter typeahead.js中取消挂起的猎犬请求

Javascript 在Twitter typeahead.js中取消挂起的猎犬请求,javascript,twitter,typeahead.js,bloodhound,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")/',

我的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)
    }
});
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
    }
});
当用户进行搜索并开始键入key之类的内容并暂停时,猎犬会向服务器发送搜索请求。然后,当用户将字母添加到输入字段时,另一个搜索将发送到服务器,例如关键字

但挂起的请求密钥首先等待浏览器完成,然后服务器处理第二个请求,只有在完成后,才会显示结果

因此,用户可能需要很长时间才能看到任何结果

当关键字被更改时,有没有办法通过猎犬来取消挂起的请求?

您可以像这样使用中止功能:

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)
    }
});
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函数并不总是阻止请求到达服务器。如果请求在调用abort之前到达服务器,服务器可能会继续处理该请求。

谢谢,这对我很有帮助。出于我的目的,我必须在settings.url中添加一个缓存破坏参数,这样猎犬就不会取消传输。