2012-04-04 3 views
3

По какой-то причине запросы ajax, которые я делаю на веб-сайте, я работаю над прерыванием в половину времени. Это разрешается, когда я устанавливаю тайм-аут для запроса ajax, как показано ниже.jQuery autocomplete timeout

$.ajax({ 
    url: "/question/why_wont_it_work", 
    timeout : 1000, 
    success: function(){ /*do stuff*/ } 
}); 

К сожалению, исправление таймаута, похоже, не работает с автозаполнением jquery. Я использую это так:

$("#questionTags").autocomplete({ 
    source: "/question/tags", 
    timeout: 1000, 
    select: function(event, ui) { /*do stuff*/ }, 
}); 

Я проверил документацию jQueryUI на веб-сайте и не видел опцию тайм-аута там. Теперь это довольно раздражает, так как половина моего запроса будет отменена, и я не получу результатов Я хочу. Есть ли способ обойти это?

Заранее спасибо.

+2

Ваш источник автозаполнения, требующий остановки сервера? Сколько данных вы работаете? Обычно люди не хотят ждать 20 секунд для заполнения автозаполнения, поэтому я предлагаю сделать это быстрее. –

+0

20 секунд действительно слишком длинный, поместите его туда, чтобы убедиться, что таймаут не будет проблемой для прерывания. – Ilians

+1

Я новичок в jQuery, и мне потребовалось некоторое время, чтобы понять, что для моего долгого автозаполнения запроса, если я потерял фокус на поле автозаполнения (скажем, чтобы проверить firebug), результаты автозаполнения не будут отображаться, даже если запрос AJAX был успешным. – WattsInABox

ответ

6

Вы можете поставить произвольную функцию с параметром source. Таким образом, вы можете вручную сделать запрос AJAX и указать timeout вариант:

var xhr = null; /* To prevent multiple calls from happening while one is in progress */ 
$("#questionTags").autocomplete({ 
    source: function (request, response) { 
     if (!xhr) { 
      xhr = $.ajax({ 
       url: "/question/tags", 
       timeout: 20000, 
       data: request, 
       dataType: "json", 
       success: function (data) { 
        xhr = null; 
        response(data); 
       }, 
       error: function() { 
        response([]); 
       } 
      }); 
     } 
    }, 
    select: function(event, ui) { /*do stuff*/ }, 
}); 

Но я с @El Ronnoco, вы, вероятно, хотите серьезно ускорить ваш запрос. 20 секунд - долго ждать.

4

Если source является строкой, для автозагрузки jQuery для загрузки данных используется код, показанный ниже, поэтому он не устанавливает тайм-аут.

Вы можете установить тайм-аут во всем мире, используя ajaxSetup так:

$.ajaxSetup({ 
    timeout: 20000, 
}); 

Но это будет влиять на все ваши запросы Ajax.


код из jquery.ui.autocomplete.js :: _initSource

self.xhr = $.ajax({ 
    url: url, 
    data: request, 
    dataType: "json", 
    context: { 
     autocompleteRequest: ++requestIndex 
    }, 
    success: function(data, status) { 
     if (this.autocompleteRequest === requestIndex) { 
      response(data); 
     } 
    }, 
    error: function() { 
     if (this.autocompleteRequest === requestIndex) { 
      response([]); 
     } 
    } 
}); 
-1
$target.autocomplete('/question/why_wont_it_work',{ 
     delay: 2000 
    }); 
+0

Вы должны что-то объяснить. – Kumar

+0

И это исправляет проблему, потому что? – enkor