2011-08-30 3 views
0

У меня проблема с Javascript, выполняющим вещи в порядке, который для меня не имеет смысла.Javascript Order Of Execution Issue

Что происходит следующая

var bValid = false; 
alert(bValid + " 1"); 
if(validateForm() == TRUE) 
{ 
    $.get("submit_manageUsers.php", 
     {action: sendAct, userID: userID}, 
     function(responseText) 
     { 
      if(responseText == "GOOD") 
      { 
       alert("Update Successful"); 
       bValid = true; 
       alert(bValid + " 2"); 
      } 
      else 
      { 
       alert(responseText + "\n Update Unsuccessful"); 
       bValid = false; 
      } 
     }, 
     "html" 
    );  
    bvalid = true; 
    alert(bValid + " 3"); 
} 
alert(bValid + " 4"); 
if(bValid == true) 
{ 
    //do something 
} 
alert(bValid + " 5"); 

EDIT: добавлено немного больше того, что на самом деле происходит в случае, если это помогает, вероятно, будет знать, как я делаю вещи!

Выхода из приведенной выше коды выглядит следующим образом:

ложных 1

ложных 2

ложных 4

ложных 5

истинного 3.

проблема в том, что if(bValid == true) i s выполняется до if(validateForm() == TRUE), поэтому это означает, что bValid всегда false.

Почему эта часть кода выполняется перед другой частью?

Любая помощь на это очень ценится!

+0

что такое значение «ИСТИНА»? – Jimmy

+0

TRUE - это функция, возвращающая функцию validateForm(), чтобы установить для переменной bValid значение TRUE. – Adam

+0

Создайте http://jsfiddle.net/, который производит этот вывод. Если 'TRUE' не определен, код будет просто терпеть неудачу и не приведет к дальнейшему выходу. Если он определен, выход будет отличаться. С моей точки зрения, порядок вывода невозможен. –

ответ

1

Javascript чувствителен к регистру. validateForm() возвращает bool вправо? Так что это либо правда, либо ложь. TRUE - нет то же самое, что и правда.

if (validateForm() == true) { // do something. } 

Я бы даже один шаг дальше и использовать жесткие равных:

if (validateForm() === true) { // do something. } 

Кроме того, bvalid является не такой же, как bValid.

В будущем я бы предложил использовать один из многочисленных инструментов javascript, чтобы помочь найти синтаксические ошибки (такие как jsfiddle, jslint, jsbin и т. Д.). Мы все совершаем ошибки, и иногда эти маленькие простые детали вызывают большие головные боли. Нет никакого компилятора (например, я использую каждый день с C#) для javascript, хотя YUI и Google используют инструменты проверки синтаксиса.

Google - http://code.google.com/closure/

Yahoo! - http://developer.yahoo.com/yui/

После получения дополнительной информации была представлена ​​в оригинальном вопросе -

Вы делаете асинхронный вызов на вашу страницу PHP, которая может занять 1 секунду или 30 секунд.

http://api.jquery.com/jQuery.ajax/

JQuery Ajax (который питает функция .get) является асинхронной по умолчанию. Однако вы можете переопределить это и сделать синхронным.

+0

Мне жаль, что это была синтаксическая ошибка, но я просто бросился при вводе вопроса, все переменные пишутся одинаково в реальном коде, я думаю, что это связано с jQuery .get и как это работает, но не совсем уверенно как это работает! – Adam

+0

Я хочу видеть, что validateForm() функция. –

+0

Вы делаете асинхронный вызов своей страницы PHP, которая может занять 1 секунду или 30 секунд. –

0

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

var bValid = false; 
alert(bValid + " 1"); 

if (validateForm()) { 
    bvalid = true; 
    alert(bValid + " 2"); 
} 

alert(bValid + " 3"); 
if (bValid) { 
    //do something 
} 

alert(bValid + " 4"); 
+0

nope, не помогло, но спасибо – Adam

0
var bValid = false; 
alert(bValid + " 1"); 

if(validateForm() == TRUE){ 
    bvalid = true; 
    alert(bValid + " 2"); 
} 
alert(bValid + " 3"); 

setTimeout(function() { // Continue le script après l'insertion du html 
    if(bValid == true){ 
     //do something 
    } 
    alert(bValid + " 4"); 
}, 0); 

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

0

$.get является асинхронным. Это означает, что вы отправляете сообщение, вы повесите трубку, и вы ждете, когда jQuery перезвонит вам, когда это будет сделано с submit_manageUsers.php. Шаг 3 и Шаг 4 выполняются после того, как вы повесили трубку, но шаг 2 происходит только после вызова callback, который может быть временем. Вот почему ваши сообщения не в порядке.

$.get(url, data, function(response) { 
    if (response == 'GOOD') { 
     alert('success!'); 
     DoSomethingMeaninfulHere(); 
    } else { 
     alert(response + "\n Update Unsuccessful"); 
    } 
}); 

вы должны поместить вызов

// DoSomethingMeaningfulHere 
alert(bValid + " 4"); 
if(bValid == true) 
{ 
    //do something 
} 
alert(bValid + " 5"); 

внутри обратного вызова для того, чтобы быть выполнена в нужное время (который после запроса AJAX завершает)