2012-05-10 2 views
3
$(document).ready(function() { 
    state = 0; 
    $('#btnlogin').click(function() { 
     $.post("php/redirect.php", { 
      Username : $('#qi').attr('value'), 
      Password : $('#password').attr('value') 
      }, function(data) { 
      console.log('first'+state); 
      state = 3; 
      console.log('second'+state); 
     }); 
     console.log('third'+state); 
    }); 
}); 

Сначала я объявил глобальную переменную и установить его в 0.
Во внутренней функции Я хочу, чтобы установить вар на другое значение, но мой выход обыкновение устанавливать в (глобальный) external var, он будет установлен как локальный var. Моя другая проблема - это порядок, в котором я получаю вывод.переменная не доступна для записи во внутренней функции

Выход:

third0<br> 
first0<br> 
second3<br> 
+1

Ну, порядок вывода правильный, учитывая асинхронную задачу ajax. Не могли бы вы подробнее рассказать о первой проблеме (или это связано с этой проблемой)? – fcalderan

+0

@ Ф. Калдеран прав, порядок правильный - какой порядок вы ожидали? –

+0

да, теперь я понимаю, но позади это моя настоящая проблема;) пожалуйста, взгляните на мой другой комментарий к следующему ответу. thx – mrmoor

ответ

1

Это происходит потому, что console.log('third'+state); находится вне $.post (AJAX) вызовов и вызовов быстрее, чем Ajax ответ.

Кажется, вы неправильно поняли, что AJAX - это асинхронный.

+0

О, да, я забыл ^^ Я хочу, чтобы щелчок вернул true или false в зависимости от возврата запроса ajax – mrmoor

1

Проблема заключается в том, что внутренняя функция вызова $.post будет выполняться сперва, когда почтовый вызов возвращается с сервера.

Таким образом, вы программа поток будет идти, как это, когда кнопка нажата:

$.post("php/redirect.php", это будет вызывать метод redirect.php на стороне сервера, и на следующую функцию, которая будет вызвана, если будет завершен :

function(data) { 
    console.log('first'+state); 
    state = 3; 
    console.log('second'+state); 
} 

Тогда функция продолжает и запускает следующий код:

console.log('third'+state); 

на данный момент, состояние по-прежнему 0, так выход - third0.

Затем Ajax вызов завершается, и призывает вас работать выше, и, таким образом, выводит следующее:

first0 
second3 

проблема Вы просто ожидая, что строки в методе, в том числе функции вы определяете внутри будет работать в тот же порядок, что и в вашем скрипте.

+0

ok, теперь я получил его;) Но моя реальная проблема заключается в том, что я хочу вернуть true или false из обработчика кликов в зависимости от формы вывода запроса ajax. Проблема var приводит к моему промаху понятию ajax ^^ – mrmoor

0

Выхода очень просто объяснить:

После загрузки документа вы начинаете связывать обработчик щелчка на какую-то кнопку. Обработчик щелчка работает следующим образом:

  • Запуск асинхронного AJAX вызова
  • выхода из 'third'+state

В этой точке состояния 0, поэтому первый выход third0.

Через некоторое время запрос AJAX претерпел, и вы получили свой ответ. При получении ответа вы запишитесь на номер 'first'+state. С state по-прежнему 0 вы получаете результат first0.

После этого вы меняете значение state на три и на третий выход, который дает вам second3.

Чтобы понять поведение, вам следует ознакомиться с асинхронной версией AJAX или изменить запрос на синхронный стиль. Позже это очень плохо, так как это сделает вашу страницу недоступной, пока запрос все еще запущен.

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