【问题标题】:Cancel pending bloodhound request in Twitter typeahead.js在 Twitter typeahead.js 中取消挂起的 Bloodhound 请求
【发布时间】:2015-11-16 14:59:23
【问题描述】:

我有这样的 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)
    }
});

当用户进行搜索并开始输入“key”之类的内容并暂停时,猎犬会向服务器发送搜索请求。当用户随后在输入字段中添加字母时,会向服务器发送另一个搜索,例如“关键字”。

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

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

有没有办法在关键字更改时通过bloodhound取消挂起的请求?

【问题讨论】:

    标签: javascript twitter typeahead.js bloodhound


    【解决方案1】:

    您可以像这样使用 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() 之前到达服务器,服务器可能会继续处理请求。

    【讨论】:

    • 谢谢,这帮助了我。出于我的目的,我必须在 settings.url 中添加一个缓存破坏参数,这样猎犬就不会取消传输。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-10-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-02-14
    相关资源
    最近更新 更多