2014-01-10 12 views
-1

У меня есть этот код:Прервать вызов «полный:» Обратный вызов

$(function() { 
     (function poll(){ 
      var update_progress = setTimeout(function(){ 
        var jxhr = $.ajax({ 
         type: "POST", 
         url: "grab.php", 
         data: "test", 
         success: function(data){ 
          var error = data.error; 

          if(error == false) { 
           // My nonsense is here 
          } else if(error == true) { 
           // Stop sending AJAX request 
           clearTimeout(update_progress); 
           jxhr.abort(); 
          } 

         }, dataType: "json", complete: poll, timeout: 2000 }); 
      }, 2000); 
     })() 
    }); 

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

Таким образом, он не должен больше выполнять какой-либо запрос ajax. Как бы то ни было. Что я сделал не так?

+1

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

+0

Это просто логично ^^ Я просто хочу прекратить дальнейшие запросы. – Michael

+0

Правильно, но это логика. Вы должны отменить использование какого-либо флага. –

ответ

0

Я думаю, что что-то подобное может работать:

$(function() { 
    (function poll(){ 
     var keepPolling = true; 
     var update_progress = setTimeout(function(){ 
       var jxhr = $.ajax({ 
        type: "POST", 
        url: "grab.php", 
        data: "test", 
        success: function(data){ 
         var error = data.error; 

         if(error == false) { 
          // My nonsense is here 
         } else if(error == true) { 
          // Stop sending AJAX request 
          keepPolling = false; 
         } 

        }, dataType: "json", complete: function() { 
         if (keepPolling) { 
          poll(); 
         } 
        }, timeout: 2000 }); 
     }, 2000); 
    })() 
}); 

В основном, имеют дополнительный вар, который отслеживает, если вы хотите, чтобы продолжить опрос. По умолчанию это значение true и значение false, когда вы получите сообщение об ошибке. Затем в полном методе вы проверяете, хотите ли вы продолжать опрос, прежде чем снова вызвать опрос.

Я не уверен, что первый или первый вызов называется. Если сначала вызывается complete, это не будет работать (хотя вы, вероятно, можете добавить проверку keepPolling в верхней части функции, переданной в setTimeout).

+0

Большое спасибо. Также для объяснения. Я очень новичок в javascript/jquery, так что это мне очень помогает. Благодаря! – Michael

1

Из документов:

complete - A function to be called when the request finishes (after success and 
error callbacks are executed). 

Поэтому независимо от того, что вы делаете в success обработчика poll() будет всегда называться. Самое простое решение было бы

if(error == false) { 
    ... 
    poll(); 
} 
else { 
    //don't poll ;) and forget clearTimeout and abort as it's useless 

На дополнительных вещах: я случай ошибки сценарий должен возвращать правильный код состояния НТТРА (некоторые 4xx или 5xx). Затем вы можете поместить свой код обработки ошибок в соответствующий обработчик error вместо обработчика success.

Смежные вопросы