JavaScript: значение переменной теряется между функциями - PullRequest
2 голосов
/ 02 декабря 2009

У меня есть следующий код

function updateSliderContent(json) {  //<- json defined here is correct
   var screen_order = json.screen_order.split('_');
   jQuery.each(screen_order, function(i, item) {
      var screen_id = item;
      //at this point it is not, thus the function does not execute whatever is in the if blocks
      if (json[screen_id].action == 'add') {
         //doSomething  
      } else if (json[screen_id].action == 'remove') {
         //doSomthingElse
      };
   }
}

Моя проблема в том, что каким-то образом значение json (который является объектом из AJAX-вызова) теряется в каждой функции jquery. Я еще не выяснил, почему и как это решить. Google не дает мне ответ, который я ищу.

Редактировать 1

Вот фактический звонок.

function updateSlider() {
   var screenOrder = '';
   jQuery('div#slider td').each(function(i, item) {
      screenOrder += this.abbr + '_';
   })
   var ajaxData = {
      sid: sid,
      story: story,
      date: theDate,
      screenOrder: screenOrder,
      mode: 'ajax_update_slider'
   };
   jQuery.ajax({
      data: ajaxData,
      dataType: 'json',
      success: function (json) {
         updateSliderContent(json);
      }
   });
   theDate = Math.round(new Date().getTime()/1000.0); //UNIX Timestamp
   sliderTimer = setTimeout('updateSlider();',15000);
};

Ответы [ 5 ]

2 голосов
/ 03 декабря 2009

Я пытался воспроизвести вашу проблему в JS Bin:
http://jsbin.com/ereha (редактируется через http://jsbin.com/ereha/edit)

Код, который вы показали нам до сих пор, кажется вполне нормальным, поэтому проблема должна быть вызвана какой-то другой частью вашего кода или системы. Мы все просто стреляем в темноте, если не знаем, в чем проблема.

Пожалуйста, попробуйте воспроизвести проблему на http://jsbin.com, и мы поможем вам оттуда.

Полный исходный код

index.html

<!doctype html>
<html lang="en">
  <head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
    <title>/1115230/javascript-znachenie-peremennoi-teryaetsya-mezhdu-funktsiyami</title>
    <script type="text/javascript" src="http://getfirebug.com/releases/lite/1.2/firebug-lite-compressed.js"></script>
    <script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.3.2/jquery.min.js"></script>
    <script type="text/javascript">
      $.ajaxSetup({url: 'test.json'});

      function updateSliderContent(json) {  //<- json defined here is correct
        var screen_order = json.screen_order.split('_');
        jQuery.each(screen_order, function(i, item) {
          var screen_id = item;
          //at this point it is not, thus the function does not execute whatever is in the if blocks
          if (json[screen_id].action == 'add') {
            console.log(screen_id, 'action add');
          } else if (json[screen_id].action == 'remove') {
            console.log(screen_id, 'action remove');
          };
        });
      }

      function updateSlider() {
        var ajaxData = {};
        jQuery.ajax({
          data: ajaxData,
          dataType: 'json',
          success: function (json) {
            updateSliderContent(json);
          }
        });
        // theDate = Math.round(new Date().getTime()/1000.0); //UNIX Timestamp
        sliderTimer = setTimeout('updateSlider();',15000);
      };

      $(updateSlider);
    </script>
  </head>
  <body>
  </body>
</html>

test.json

{
  'screen_order': 'foo_bar_baz',
  'foo': {
    'action': 'add'
  },
  'bar': {
    'action': 'add'
  },
  'baz': {
    'action': 'remove'
  }
}
1 голос
/ 02 декабря 2009

Кажется, с jQuery.each все в порядке, поскольку я не могу воспроизвести вашу проблему.

        function alertName (json) {
            var a = new Array();
            a.push(1);
            a.push(2);

            jQuery.each(a, function(i, item) {
                alert(json[0].name);
                alert(json[1].name);
            });
        }

        var andre = { name: "André" }
        var joana = { name: "Joana" }

        var arrayOfJson = new Array();
        arrayOfJson.push(andre);
        arrayOfJson.push(joana);

        alertName(arrayOfJson);

alertName() функция работает именно так, как и должна. Параметр json не теряется в функции jQuery.each

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

0 голосов
/ 02 декабря 2009

Я думаю, вы должны убедиться, что функция updateSliderContent вызвана после ответа json со стороны сервера.

Код ниже не должен работать:

    var json = {};

    $.getJSON("/url/", {}, function(data){
        json = data;
    });

    //we call our function before the server response
    //and the json will be just blank object
    updateSliderContent ( json );

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

Приведенный ниже код должен работать, и объект json не должен быть пустым, если сервер действительно отвечает на правильный json.

    $.getJSON("/url/", {}, function(json){
        //we call only after the response from server
        updateSliderContent ( json );
    });
0 голосов
/ 02 декабря 2009

tray в предложении if () для использования item.action , потому что если данные json являются массивом объектов, item будет содержать каждый объект , но это только мое предположение

0 голосов
/ 02 декабря 2009

Вы уверены, что json - это объект? Может быть, это JSON-строка? Чем вы должны eval это перед использованием.
Если вы получите его через $.ajax(), не забудьте добавить dataType:'json' в качестве опции ...

...