Используйте jquery для получения большого количества данных - PullRequest
0 голосов
/ 13 апреля 2010

Я создал эту систему чата, которая работала нормально до тех пор, пока количество сообщений не увеличилось (более 300 сообщений, и я хочу, чтобы оно занимало до 1000), и начало вызывать медленный сценарий и занимало время для извлечения всех данных. Идея зависит от выбора стиля XML данных, а затем добавить его на определенную вкладку и повторить действие с помощью setTimeout, есть ли другой способ, которым я могу сделать, мне действительно нужны идеи, и вот мой код.

 function updateMessage()
 {
  $.post("db.php",
  {MsgNo :$("#no_of_msgs").val()},
  function(data)
 {
   $(data).find("message").each(function() {
   var msg_id = $(this).find("msg_id").text();
   var date_time = $(this).find("date_time").text();
   var from_user = $(this).find("from_user").text();
   var from_user_id = $(this).find("from_user_id").text();
   var from_group = $(this).find("from_group").text();
   var to_user = $(this).find("to_user").text();
   var to_user_id = $(this).find("to_user_id").text();
   var to_group = $(this).find("to_group").text();
   var msg_type = $(this).find("msg_type").text();
   var msg = $(this).find("msg").text();
   var from_grp_abr = $(this).find("from_grp_abr").text();
   var to_grp_abr = $(this).find("to_grp_abr").text();
   var flagged = $(this).find("flagged").text();
   var onlydate = getonlydate(date_time);
   $("#no_of_msgs").val(msg_id);


   if (from_group == $("#login").val())
{
 var reply = '';
}
else {var reply = 'reply';}

   if(from_user == "")
   {
    var handle_reply = from_grp_abr;
   }
   else 
   {
    var handle_reply = from_user;
   }

   var html = "<tr id='row_"+msg_id+"'>";
   html += "<td><a class='bullet' onclick='changeStatus(\""+msg_id+"\")'>&nbsp;<\/a><\/td>";
   html += "<td><a class='"+reply+"' onclick=\"reply('"+escape(handle_reply)+"','"+escape(to_user)+"',"+from_user_id+","+to_user_id+");\">  <\/a><\/td>";
    html += "<td class='time'>"+date_time+"<\/td>";
     html += "<td>"+from_user+"&nbsp;["+from_grp_abr+"]"+"<\/td>";
     html += "<td>"+to_user+"&nbsp;["+to_grp_abr+"]"+"<\/td>";
     html += "<td><a href='#' class="+msg_type+"><\/a><\/td>";
html += "<td><a id='flag_"+msg_id+"' class='"+class_flag+"' onclick='flagMsg("+msg_id+")'>  <\/a><\/td>";
         html += "<td>"+msg+"<\/td>";
         html += "<td>"+from_grp_abr+"<\/td><\/tr>";

           $('#no_of_msgs').val(msg_id);

  $("#tbody1").prepend(html);
updatetabledata('t1');
alternateRows('t1');
 //append data to tab2 messages received
    if (to_group == $("#login").val())
    {
         $("#tbody2").prepend(html);
         updatetabledata('t2');
         alternateRows('t2');
      }
   //append data to tab3 sent messages
else if (from_group == $("#login").val())
   {
   $("#tbody3").prepend(html);
   updatetabledata('t3');
   alternateRows('t3');
  }

   if(from_group != $("#login").val())
  {
   $("#tbody"+from_group).prepend(html);
   updatetabledata('t'+from_group);
   alternateRows('t'+from_group);
  }
   if(to_group != $("#login").val())
  {
   $("#tbody"+to_group).prepend(html);
   updatetabledata('t'+to_group);
   alternateRows('t'+to_group);    
  }
    });
 });
   setTimeout('updateMessage()',3000); 
 }

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

1 Ответ

2 голосов
/ 13 апреля 2010

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

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