jQuery Ajax завершен, но не эта функция

#jquery

#jquery

Вопрос:

У меня есть следующий код:

 $(document).ajaxComplete(function () {
    tips();
});
  

Который снова запускает функцию tips при завершении события ajax! Однако функция tips ТАКЖЕ содержит ajax-запросы, поэтому она вызывает себя, что я не хочу делать!

Как я могу запускать подсказки при завершении событий ajax, ЗА исключением случаев, когда это запрос tips ajax

Ответ №1:

Функция обратного вызова для ajaxComplete() может быть настроена для получения подробной информации о запросе ajax. Затем вы можете передать специальную настройку при вызове ajax, которая позволяет вам указывать, когда вы должны или не должны вызывать функцию tips:

 function tips() {
    var settings = {
        is_tips_call: true
    };

    $.ajax('#', settings);

    alert("In tips");
}

$(document).ajaxComplete(function(event, xhr, settings) {

    if ('is_tips_call' in settings amp;amp; settings.is_tips_call == true) {
        // Do nothing
        return;
    }

    tips();

});
  

Я создал jsFiddle для этого, чтобы вы могли увидеть его в действии. Это предпочтительнее принятого ответа, подробности см. В Моих комментариях.

Комментарии:

1. Нет, необходимо проверять каждый запрос, чтобы убедиться, что все вызовы, отличные от tips, действительно перехвачены. Поскольку это асинхронные вызовы, вы не можете с уверенностью сказать, что между заданным вами временем и обратными вызовами не будет isTips = true isTips = false . Если какие-либо обратные вызовы будут запущены в течение этого времени, вы пропустите это.

2. Черт возьми, ты прав. 😛 Это элегантное решение. Я ненавижу ошибаться, но я признаю, что я 🙂

Ответ №2:

Редактировать

Не используйте мое решение. Используйте функцию из mmcnickle ниже.


tips(); Не могли бы вы установить флаг bool в своей функции? Что-то вроде…

 var isTips = false;

function tips(callBack){
   isTips = true;
   // rest of your code
   if(typeOf(callBack) == 'function'){
      callBack();
   }
}

$(document).ajaxComplete(function(){
   if(!isTips){
      tips(function(){
         isTips = false;
      });
   }
});
  

Комментарии:

1. или просто создайте подсказки как функцию.

2. советы — это функция, что вы имеете в виду?

3. Это решение может привести к очень странному поведению и может быть источником некоторых трудно отслеживаемых ошибок. a) isTips Флаг никогда не устанавливается false снова, поэтому после первого вызова tips() ваш ajaxComplete() обратный вызов больше не будет работать для любых вызовов ajax, независимо от того, были ли они вызваны tips() или нет. б) Запросы Ajax, которые завершаются с момента установки isTips флага и повторной установки его false, не смогут вызвать обратный вызов. Смотрите Мой ответ для решения, которое позволяет проверять по запросу , вызывать или нет tips() .

4. Я бы подумал, что он сможет понять это сам. С моим решением вы всегда можете вернуть isTips значение false после вызова tips(); ajaxComplete функции.