Ожидание завершения $ .post - PullRequest
2 голосов
/ 03 июня 2011

Похоже, что мой скрипт не хочет ждать завершения вызова $ .post.Это проблема.Вот некоторый псевдокод:

<script type="text/javascript" language="javascript">
$(document).ready(function(){
  // Global var, to be used everywhere in the ready scope 
  // Note its default value!    
  var test = false;
  $.post('test.php',{},function(result){
   if(result=='yes')
   {
    // This gets executed!
    alert('Its true! Hurraaay!');
    test = true;
   }
   else
   {
    test = false;
   }
  }

  if(test==false)
  {
   // THIS gets executed, despite the fact that we set test to true!
   alert('Awww....');
  }
  // it reaches this, showing us that there was no error!
  alert('Im alive!!!');
  // and a whoooole bunch of other code here...
}
</script>

Каков наилучший способ убедиться, что мой вызов Post завершен перед продолжением, без зависания браузера?Надеясь на то, что не слишком грязно.:)

Ответы [ 5 ]

4 голосов
/ 03 июня 2011

Не слишком беспорядочно правильно использует обратные вызовы.

Просто создайте некоторую функцию вне вызова .post() и вызывайте ее внутри .post(), когда считаете, что это уместно.Вы делаете много обратных вызовов и используете их внутри вызовов AJAX очень гибким способом.

В вашем случае, поскольку вы вызываете только alert(), нет необходимости создавать дополнительные функции - просто вызовите alert() внутри.post() звонок.Если ваш код становится больше, подумайте о создании отдельных функций.

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

2 голосов
/ 03 июня 2011
<script type="text/javascript" language="javascript">
$(document).ready(function(){
  // Global var, to be used everywhere in the ready scope 
  // Note its default value!    
  var test = false;
  $.post('test.php',{},function(result){
   if(result=='yes')
   {
    // This gets executed!
    alert('Its true! Hurraaay!');
    test = true;
  // it reaches this, showing us that there was no error!
  alert('Im alive!!!');
  // and a whoooole bunch of other code here...

   }
   else
   {
    test = false;
   // THIS gets executed, despite the fact that we set test to true!
   alert('Awww....');

   }
  }
}
</script>
0 голосов
/ 04 июня 2011

Метод JQuery .post () асинхронно подключается к вашему серверному скрипту. Вы используете функцию обратного вызова для того, чтобы программа использовала данные, когда ответ возвращается из сценария.

Вместо того, чтобы пытаться обрабатывать данные синхронно после обращения к почте, обработайте данные, когда ответ получен. Используйте функции, чтобы сделать ваш код более читабельным.

$(function() {
    postTest();
});

function postTest() {
    $.post(
        'test.php',
        {},
        function(response) {
            if(response == 'yes') {
                testSuccess();
            } else {
                testFailure();
            }
        }
    ); 
}

function testSuccess() {
    alert("Success");
}

function testFailure() {
    alert("Failure");
}
0 голосов
/ 03 июня 2011

Слишком грязно?Если вы сделаете отступ более чем на один пробел, все станет намного более читабельным и все равно будет работать нормально.

var test = false; // NOW it's global

// Just so we can use the method again
function postSomething() {
  $.post('test.php', {}, function(result) {
    if(result === 'yes') {
      alert('Its true! Hurraaay!');
      test = true;
      alert('Im alive!!!');
    } else {
      test = false;
      alert('Awww....');
    }
  });
}

$(document).ready(function() {
  postSomething();
});

Хотя это и отвратительно.

0 голосов
/ 03 июня 2011

Да, это не ждет.см. здесь:

http://fixingthesejquery.com/images/ajax101.png

и здесь:

http://fixingthesejquery.com

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...