Как вернуть переменные из callback функции в jQuery?

Discussion in 'PHP' started by ZagZag, 27 May 2009.

  1. ZagZag

    ZagZag Elder - Старейшина

    Joined:
    22 Feb 2007
    Messages:
    149
    Likes Received:
    22
    Reputations:
    1
    У меня вопрос достаточно не простой, поэтому выделю под него отдельную тему...

    Объявляю глобальную переменную, получаю запрос getJSON и присваиваю ей в callback функции полученное значение.
    PHP:
    <SCRIPT type='text/javascript'>
    $(
    document).ready(function() {
        var 
    0;
        $.
    getJSON('./index.php?cmd=json', function(data) {
            
    data.a;
            
    alert(1)
            
    alert(x)
        });
        
    alert(2)
        
    alert(x)
    });
    </SCRIPT>
    Трабла в том, что сначала выполняется alert(2) и значение переменной x = 0, а потом уже alert(1) и x принимает новое значение.
    Каким образом можно задержать выполнение скрипта пока не будет присвоено значение в callback функции?

    PS
    Более того, если это все поместить в функцию, а после нее поставить алерт 2, то он всеравно выполнится раньше чем первый ((
    Я уже обгуглился весь, ничего по теме не могу найти
     
    #1 ZagZag, 27 May 2009
    Last edited: 27 May 2009
  2. MuXaJIbI4

    MuXaJIbI4 Member

    Joined:
    20 Nov 2008
    Messages:
    66
    Likes Received:
    7
    Reputations:
    0
    так и должно быть alert(2) начнет выполняться сразу после того как будет отправлен запрос на сервер не дожидаясь возвращения результата ....

    скажи что в итоге ты хочешь получить?
     
  3. ZagZag

    ZagZag Elder - Старейшина

    Joined:
    22 Feb 2007
    Messages:
    149
    Likes Received:
    22
    Reputations:
    1
    Мне как раз нужно как-то дождаться ответа от сервера.

    getJSON у меня в функции, эта функция вызывается по событию и должна заменять глобальную переменную полученным значением
     
  4. MuXaJIbI4

    MuXaJIbI4 Member

    Joined:
    20 Nov 2008
    Messages:
    66
    Likes Received:
    7
    Reputations:
    0
    ну так операция внутри функции x = data.a; тебя чем то не устраивает?
     
  5. ZagZag

    ZagZag Elder - Старейшина

    Joined:
    22 Feb 2007
    Messages:
    149
    Likes Received:
    22
    Reputations:
    1
    Я так понял что после вызова getJSON выполнение скрипта продолжается дальше, данные еще не обновлены, потому-что ответ от сервера приходит не сразу.
    Так вот мне как раз и нужно ждать пока сервер ответит, т. к. дальнейшее выполнение скрипта без полученных данных бессмысленно. А вот как выставить задержку пока не придут данные я не знаю.

    Но быдлорешения с выставлением задержки не катят, потому-что неизвестно за какое время ответит сервер... и ответит ли он вообще
     
    #5 ZagZag, 27 May 2009
    Last edited: 27 May 2009
  6. astrologer

    astrologer Elder - Старейшина

    Joined:
    30 Aug 2007
    Messages:
    837
    Likes Received:
    267
    Reputations:
    59
    можно так:
    Code:
    <script type="text/javascript">
    $(function()
    {
      var x = 0;
      
      function next()
      {
        alert(2);
        alert(x);
      }
      
      $.getJSON('./index.php?cmd=json', function(data)
      {
        x = data.a;
        
        alert(1);
        alert(x);
        
        next();
      });
    
    });
    </script>
    или же делать синхронный запрос :)
     
    1 person likes this.
  7. MuXaJIbI4

    MuXaJIbI4 Member

    Joined:
    20 Nov 2008
    Messages:
    66
    Likes Received:
    7
    Reputations:
    0
    опередил :)
     
  8. ZagZag

    ZagZag Elder - Старейшина

    Joined:
    22 Feb 2007
    Messages:
    149
    Likes Received:
    22
    Reputations:
    1
    Эта функция вызывается из разных частей скрипта по нескольку раз.
    А можно про синхронный запрос подробнее?
     
  9. MuXaJIbI4

    MuXaJIbI4 Member

    Joined:
    20 Nov 2008
    Messages:
    66
    Likes Received:
    7
    Reputations:
    0
    а какая разница сколько раз и откуда ее вызывают если это функция
     
  10. astrologer

    astrologer Elder - Старейшина

    Joined:
    30 Aug 2007
    Messages:
    837
    Likes Received:
    267
    Reputations:
    59
    Code:
    jQuery.ajax({
      async: false,
      url: './index.php?cmd=json',
      dataType: 'json',
      success: function()
      {
        alert(1);
      }
    });
    
    alert(2);
    Хотя многие рекомендуют не использовать синхронные запросы, если в этом нет необходимости. Лучше логику пересмотреть.
     
    1 person likes this.
  11. ZagZag

    ZagZag Elder - Старейшина

    Joined:
    22 Feb 2007
    Messages:
    149
    Likes Received:
    22
    Reputations:
    1
    Спасибо, astrologer! То что надо!
    Я понимаю что с точки зрения идеологии Ajax этот код нехороший, но для отладки он мне очень сильно поможет. Пока-что требовалось чтобы скрипт выполнялся как можно более линейно.
    Потом я постараюсь сделать свой скрипт на асинхронных запросах.