2010-04-13 4 views
0

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

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); 
} 

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

ответ

2

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

+0

Я уже делаю это. И да, сообщения, кажется, извлекаются партиями, но как в первый раз это правильно, чтобы сразу получить их все ?. И если да, то как бы я разделил их на разные вкладки. – Sarah

+0

Сколько сообщений вы получаете за цикл; учитывая, что вы проверяете каждые три секунды, это будет не больше, чем пара? Попробуйте сценарий в разных браузерах ... они меняют кучи. Кроме того, большинство современных браузеров поставляются с профилировщиком javascript (я использовал только тот, который был в firebug), и все они должны быть достаточно хороши в том, чтобы сказать вам, какие методы съедают ваше время. Прерывание вашей функции в несколько методов поможет изолировать проблему. – CurtainDog

Смежные вопросы