давая javascript / серверу время на обработку - PullRequest
1 голос
/ 29 июня 2009

У меня запутанная проблема. Я работаю над музыкальным каталогом / плейлистом / плеером. Когда пользователь перетаскивает песню в список воспроизведения, на php (через javascript / ajax) отправляется запрос, который находит песню в базе данных и возвращает информацию о песне, которая затем организуется и отображается в списке воспроизведения. Это прекрасно работает. У меня проблема, когда альбом добавляется в список воспроизведения (который просто вызывает функцию обработки песни рекурсивно). Если у меня есть предупреждение перед обработкой каждой песни, она работает отлично; Конечно, я не хочу, чтобы пользователь нажимал 20 предупреждений, просто чтобы добавить альбом, он просто должен увидеть готовый продукт. Когда я отключаю оповещение, отображается только последняя песня. Я предполагаю, что серверу нужно больше времени, может быть? Javascript может быть? Я не знаю, я хватаюсь за соломинку. Кто-нибудь сталкивался с подобной проблемой ?? Вся помощь очень ценится ...

Ответы [ 9 ]

1 голос
/ 29 июня 2009

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

Я бы предложил воспроизвести вашу проблему на небольшой тестовой странице. Вы, вероятно, решите это в процессе, но если вы можете воспроизвести это, мы можем помочь: -)

0 голосов
/ 17 октября 2009

Что делает этот кусок?

   //remove items already in playlist and fix elementId
   if(elementId.match(/\b\d{4}/))
   {
    //CALL REORDER
    oldNode = document.getElementById(elementId);
    oldNode.parentNode.removeChild(oldNode);

    //snyc player and playlist (decrement)\
    updateFlashPlrIndex(elementId, 'dec');

    //remove leading playlist number (####)
    elementId = elementId.substr(4);
   } // end if( elementId.match(/\b\d{4}/) )

Ваш комментарий говорит, что он удаляет элементы в плейлисте, это может быть частью вашей проблемы?

Также вы должны отправить полный массив идентификаторов на сервер за один вызов, получить данные в виде массива и обработать их все сразу. Если вы делаете что-то подобное для своих параметров:

var params = "elementIDs=[" + elementIDs.join() + "]";

У вас будет массив элементов ID в кодировке json. Конечно, elementID должны быть массивом всех идентификаторов, которые были отправлены. Затем в вашем php декодируйте его, используя функцию json_decode, например:

//  Parameter checking goes here
$elementIDs = json_decode($_GET['elementIDs']);

Тогда у вас будет массив для работы с вашим php. Когда вы закончите обработку, убедитесь, что любая форма, в которую вы возвращаете данные, также поддерживает массивы. Еще одним преимуществом здесь является то, что у вас не будет никакой специальной обработки только для одного элемента, которая избавит от некоторой части вашего кода и удалит любую рекурсию.

0 голосов
/ 12 октября 2009

Сценарий должен отправлять несколько запросов на песни, а затем возвращать один ответ. Если вы посмотрите на firebug, вы, вероятно, отправляете несколько запросов и получаете несколько обратно.

Либо JavaScript перезаписывает себя, либо, что более вероятно, последняя песня обрабатывается первой, но возвращается последняя, ​​поэтому другие песни добавляются после последней песни.

Так что, честно говоря, просто соберите их всех в одном запросе, у вас есть состояние гонки на стороне сервера с задержкой на стороне клиента.

0 голосов
/ 30 сентября 2009

Я верю, что у вас есть ошибка в вашем коде JS. Вы можете перезаписать содержимое контейнера, содержащего отброшенные элементы, или все элементы будут перезаписаны в одном месте.

Попробуйте регистрировать каждое ваше движение и интенсивно использовать firebug, если вы не можете обнаружить что-то не так с вашим кодом js с первого взгляда.

0 голосов
/ 30 июня 2009

Вы проверяли свое дерево DOM и / или свой access_log? Возможно, ваши песни действительно присутствуют, но что-то в вашем процессе мешает их правильному отображению.

0 голосов
/ 30 июня 2009

Это может быть в потоке javascript, который не существует.

Мой совет - запустить его с setTimeout ('p_process (elementId):', 0); на вашем dropevent Тогда браузер не будет заблокирован JavaScript.

.. также возможно вам стоит взглянуть на jQuery, чтобы сделать ajax немного легче;)

0 голосов
/ 29 июня 2009

вся начальная функция (вызывается, когда что-либо пропускается в списке воспроизведения):

function p_process(elementId){

//alert("entered p_process");
//check if the element dropped is a single song
var newSong = document.getElementById(elementId);
//alert("newSong id = " + newSong.getAttribute('id'));
if(newSong.hasAttribute('class')){
  //alert("newSong has attribute class");
  if(newSong.getAttribute('class') === 'song'|| newSong.getAttribute('class') === 'row-even'||newSong.getAttribute('class') === 'row-odd'){
  alert("newSong is a song");
  //set elements vertical position
  var aryPosition = ObjectPosition(document.getElementById(elementId));
  var elmVertPosition = aryPosition[1];

  //account for clones
  if(elementId.match("clone_")){
   elementId = elementId.substr(6);
   }

  //remove items already in playlist and fix elementId
  if(elementId.match(/\b\d{4}/)){
    //CALL REORDER
    oldNode = document.getElementById(elementId);
    oldNode.parentNode.removeChild(oldNode);

    //snyc player and playlist (decrement)
    //alert("sending " + elementId + " updateFlashPlrIndex");
    updateFlashPlrIndex(elementId, 'dec');
    //alert("returned from syncplrsub");

    //remove leading playlist number (####)
    elementId = elementId.substr(4);
  }//end if

  if(xmlHttp){
    try{
      var params = ("elementId=" + elementId);
      //alert(params);
      xmlHttp.open("GET", "php/p_songInfoRetrevial.php?" + params, true);
      //the weird function stuff is because you're assigning a function to a variable
      xmlHttp.onreadystatechange = function(){p_handleRequestStateChange(elementId, elmVertPosition);};
      xmlHttp.send(null);
    }//end try
    catch(e){
    alert("Can't connect to server: \n" + e.toString());
  }//end catch
}//end if(xmlHttp)
}//end inner if

//new element is not a song
else if(newSong.getAttribute('class') === 'show'){
//alert("entered else");
var newElm = newSong;
for(var currElm = newElm.firstChild.nextSibling.nextSibling; currElm !== null; currElm = currElm.nextSibling){
//alert("currElm being sent to p_process = " + currElm.getAttribute('id'));
p_process(currElm.getAttribute('id'));
}//end for
}

else{//need to skip over <ol>s, this will only work for sets/encores
alert("entered else");
var newElm = newSong;
for(var currElm = newElm.firstChild.nextSibling; currElm !== null; currElm = currElm.nextSibling){
//alert("currElm being sent to p_process = " + currElm.getAttribute('id'));
p_process(currElm.getAttribute('id'));
}//end for
}//end else
}//end outer if
}
0 голосов
/ 29 июня 2009

Как только функция обработки песни очищает несколько вещей, она делает ...

if(xmlHttp){
try{
  var params = ("elementId=" + elementId);
  //alert(params);
  xmlHttp.open("GET", "php/p_songInfoRetrevial.php?" + params, true);
  //the weird function stuff is because you're assigning a function to a variable
  xmlHttp.onreadystatechange = function(){p_handleRequestStateChange(elementId, elmVertPosition);};
  xmlHttp.send(null);
}//end try
catch(e){
  alert("Can't connect to server: \n" + e.toString());
}//end catch
}//end if(xmlHttp)
0 голосов
/ 29 июня 2009

Довольно сложно ответить на это, не видя, как вы взаимодействуете с сервером. PHP + Mysql не должен требовать больше времени, то есть, если вы ожидаете ответное сообщение с сервера. Если, с другой стороны, ваш javascript определяет, что он хочет что-то делать независимо от того, получил ли он ответ от сервера, тогда вы вполне можете столкнуться с проблемами состояния гонки. Опубликуйте некоторый код, подробно описывающий, как вы общаетесь между сервером и скриптом, чтобы можно было понять, что идет не так.

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