JavaScript выполняется только с точкой останова - PullRequest
0 голосов
/ 02 июля 2011

У меня действительно странная проблема с JS и jQuery.

$('#skip').click(function(e) {
   savePhoto('skip');
   showNextPlace();
   photo_changed = 0;
   return false;
});

showNextPlace() и photo_changed = 0; выполняются только при добавлении точки останова. Код savePhoto(); очень простой. Я отправляю запрос в зависимости от статуса и количества элементов в массиве мест.

function savePhoto( status )
  {
      if ( places.length <= 5 )
      {
          // load more places
          $('#loadmore').val('1');
      }

      // Don't send a request on skip unless we need more places
      if ( status != 'skip' || $('#loadmore').val() == 1 )
      {
          $.ajax({
              url: "url" + status,
              cache: false,
              data: $('#form_photo').serialize(),
              success: function(results){
                  // dont load more places until we have few
                  $('#loadmore').val('0');

                  if ( results != '[]' )
                  {
                      for ( var i in results )
                      {
                          places.push( results[i] );
                      }
                  }
              }
          });
      }
  }

Есть идеи о том, почему это происходит или как лучше отладить проблему?

Ответы [ 3 ]

2 голосов
/ 02 июля 2011

Асинхронный вызов XHR

$.ajax({ ... })

, вероятно, прибывает, когда есть точка останова, но когда она не выполняется с точкой останова, запрос XHR все еще находится в полете, когда этот код достигнут.

Возможно, вам нужен обратный вызов для вызова $ .ajax, который показывает следующее место после загрузки мест.

Вы могли бы иметь вызов обработчика $ .ajax showNextPlace, если логическое значение needsToShowNextPlace истинно, и showNextPlace установить это логическое значение, если он вызывается, когда нет следующих мест для показа.

1 голос
/ 02 июля 2011

Поскольку вызов $.ajax является асинхронным, вы должны поместить свой код в обработчик success следующим образом:

success: function(results){
  // dont load more places until we have few
  $('#loadmore').val('0');
  if ( results != '[]' )
  {
      for ( var i in results )
      {
          places.push( results[i] );
      }
  }
   showNextPlace(); //Moved here
   photo_changed = 0; //Moved here  
}

Таким образом, ваша привязка клика будет:

$('#skip').click(function(e) {
   savePhoto('skip');
   return false;
});

Это не сработало, потому что в вашем исходном коде showNextPlace() и photo_changed=0 выполнялись до того, как savePhoto('skip') завершил выполнение. (это асинхронный). Он работал с точкой останова, потому что дал savePhoto() достаточно времени, чтобы закончить.

Надеюсь, это поможет. Приветствия

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

Проблема не связана с вызовом AJAX.В другой части кода я связывал событие с полем изображения каждый раз, когда пользователь нажимал кнопку сохранения (поэтому во второй раз код выполнялся 2 раза, 3-й - 3 и т. Д.). Не забудьте отменить привязку!

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

Решение: console.log () на каждом пути, которыйлогика может уйти.

...