2013-09-17 3 views
2

У меня есть эта проблема, когда я использую setInterval и ajax для извлечения данных из базы данных, и если данные, которые я получаю из базы данных, равны saveHere, тогда она будет циклически повторяться до тех пор, пока она не будет соответствовать переменной saveHere, он заморозит браузер до тех пор, пока данные, которые я получаю, не равны saveHere.setInterval и Ajax

Вот пример:

var saveHere = 'RED'; 
var interval = setInterval(function() { 

    var sample = $.ajax({ 
     type: 'GET', 
     url: 'database.php', 
     data : data 
    }).responseText; 

    if (sample != 'RED') { 
     clearInterval(interval); 
     saveHere = sample; 
    } 
    else { 
     console.log('load again'); 
    } 

},1000); 

Мне очень нужен совет. Заранее спасибо. Извините за грамматику.

+0

Что именно вы пытаетесь сделать? Может быть более элегантный способ достижения ваших конечных целей :) –

+0

Я хочу совет, потому что этот код заставляет замораживать браузер, и я даже не могу нажать кнопку, пока не найдет, что данные, которые я извлекаю, не равны saveHere. Спасибо за ответ. – reyes

ответ

2

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

Я был бы соблазн сделать только один запрос в то время, что-то вроде:

var saveHere = 'RED'; 
makeAjaxCall(); 

function makeAjaxCall() { 
    var url = 'database.php'; 
    var data = {}; 
    $.get(url, data, function(response_text){ 
     if (response_text != 'RED') 
     { 
      saveHere = response_text; 
      // do whatever else you need... 
     } 
     else 
     { 
      // make another call... 
      console.log('calling again...'); 
      makeAjaxCall(); 
     } 
    }, "text"); 
} 
+0

Спасибо за ваш ответ sir @chris, проблема в том, что когда я использую этот код, он замораживает браузер. – reyes

+0

Вы имеете в виду образец кода, который я предложил @reyes? Я исправил код выше, чтобы на самом деле вызвать функцию на этот раз> __ O –

+0

no sir, Im sorry, мой код, который я имею в виду. но я хочу спросить, может ли этот код заморозить броузер. – reyes

0

Вы интервал очистки, что означает, что после этого не будет интервала.

Вместо этого вы можете сделать внутренний интервал внутреннего интервала, если условие указано ниже.

var interval = setInterval(function() 
{ 
    if(sample != 'RED') { 
     var sample = $.ajax({ 
      type: 'GET', 
      url: 'database.php', 
      data : data 
     }).responseText; 

    saveHere = sample; 
    } 
    else 
    { 
     console.log('load again'); 
    } 
},1000); 
+0

Я использую clearInterval, чтобы при завершении поиска данных из базы данных он не зависал. – reyes

0

В своем коде вы проверить не равным 'RED'.

if(sample != 'RED'){ . . . 

Та часть петель останавливает интервал

Если не равно красный

}else{ 

Это нагрузка снова "простой бревен без очистки интервала

Что именно вы пытаетесь достичь?

+0

Вот как ОП описал это: «равен saveHere, тогда он снова зациклится» –

+0

да, сэр, потому что я делаю настольную игру, когда я закончу движение. Я перейду к этому коду, чтобы узнать, перемещается ли другой игрок , жаль, что не упоминал об этом. спасибо за ответ – reyes

7

$.ajax является асинхронным и требует использования обратного вызова для получения текста ответа.

Посмотрите на документацию на http://api.jquery.com/jQuery.ajax/

То, что вы хотите сделать, это добавить параметр success. Что-то вроде этого:

var saveHere = 'RED'; 

doAjax(); 

function doAjax() { 

    $.ajax({ 
     type: 'GET', 
     url: 'database.php', 
     data: data, 
     success: function (sample) { 
      if (sample != 'RED') { 
       saveHere = sample; 
      } else { 
       console.log('load again'); 
       doAjax(); 
      } 
     } 
    }); 

} 

Обратите внимание, как я удалил setInterval и вместо этого обернул код Ajax в функции. Обратный вызов success вызывается, когда запрос Ajax успешно завершен и дает вам ответ. После того как мы проверили ответ, мы снова можем запустить функцию doAjax, чтобы снова выполнить запрос.

+1

Это может быть немного жестким на сервере без setTimeout в отзыве doAjax, чтобы немного отложить запросы. –

+0

спасибо за совет, я думаю, проблема в моей программе заключается в том, что она использует setInterval и замораживает браузер. – reyes

+0

Хорошая точка в асинхронном характере '$ .ajax' ... вам не нужно сначала называть' doAjax() '? –

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