2015-11-16 9 views
3

У меня есть твиттер typeahead.js установки, как это:Отменить ожидание ищейки запрос в 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) 
    } 
}); 

Когда пользователь делает запрос и начинает печатать что-то вроде «ключа» и делает паузу, запрос поиска отправляется на сервер ищейкой. Когда пользователь затем добавляет буквы в поле ввода, другой поиск отправляется на сервер, например «ключевое слово».

Но ожидающий запрос «ключ» сначала ожидает завершения браузером, а затем сервер обрабатывает второй запрос и только после его завершения показываются результаты.

Так что это может занять много времени, прежде чем любые результаты будут видны пользователю.

Есть ли способ отменить ожидающий запрос через ищейку при изменении ключевого слова?

ответ

1

Вы можете использовать прерывание() функцию следующим образом:

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(), сервер может продолжить обработку запроса.

+0

Спасибо, это помогло мне. Для моих целей мне пришлось добавить параметр busting для кеша в settings.url, чтобы ищейка не отменила транспорт. – strictlyk3v