setTimeout与Ajax聊天

Ok Hi Help help help I am having a major problem with setTimeout it is not working and i did everything not working

I am developping a chat system so i need to send and recieve messages (i test it by opening 2 browser windows)

Here is the code i changed many times I hope any one can help me

javascript

$(document).ready(function()
{
    updateMsg();
});

function updateMsg()
{
$.ajax({
    url:"db.php",
    type:"POST",
    success:function(data){
    }
});
setTimeout("updateMsg()",7000);
}

function addMessages()
{
$.ajax({
    url:"db.php",
    type:"POST",
    data:"name="+$("#name").val()+"&to="+$("#user2").val()+"& cc="+$("#user").val()+"&msg="+$("#msg").val(),  
    success:function(data)
    {
    $("#t1").prepend(data);}
});

}

php

$user_select = mysql_query("SELECT * FROM User WHERE User_name = '$name'") 
                        or die(mysql_error());
$fetch_select = mysql_fetch_array($user_select);
$user_check = mysql_num_rows($user_select);

if(isset($_POST['msg']) && $_POST['msg'] != '')
{
  if ($user_check == 0)
 {
mysql_query("INSERT INTO User (User_name) VALUES ('$name')") or die(mysql_error());

$new_user = mysql_query("SELECT * FROM User WHERE User_ID = LAST_INSERT_ID()");

$fetch_new_user = mysql_fetch_array($new_user);

mysql_query("INSERT INTO Messages(From_user,Msg_body,Date_Time) 
             VALUES ('$fetch_new_user[User_ID]','$msg',NOW())") or     die(mysql_error());
  }

  else 
    {
        mysql_query("INSERT INTO Messages(From_user,Msg_body,Date_Time) 
             VALUES ('$fetch_select[User_ID]','$msg',NOW())") or   die(mysql_error());
   }
   }

  $sql = mysql_query("SELECT Msg_body,Date_Time,User_name
                FROM Messages,User
                WHERE From_user = User_ID
                AND Msg_ID = LAST_INSERT_ID()
                ORDER BY Date_Time DESC") or die(mysql_error());

while($result = mysql_fetch_array($sql))
   {
       $mydata = '<tbody id="tbody1">
 <tr class="highlight">
<td  width="30" id="bullet" align="center">
<a href="#" class="nohighlight">&#8226;</a></td>
<td width="30px" align="center" id="replyImg"><input type="image" src="css/images/reply_arrow.png" onClick="reply()"></input></td>
<td width="70" align="Left" id="time">'.$result["Date_Time"].'</td>
<td width="200" align="Left" id="from">'.$result["User_name"].'</td>
<td width="200" align="Left" id="to">'.$result[""].'</td>
    <td id="showMsg">'.$result["Msg_body"].'</td>
    <td width="200" align="left" id="group">'.$result["Grp_abr"].'</td>     
  </tr>
  </tbody>';

}

    echo $mydata;

 ?>

Thanks guys

It's very unlikely that there's anything wrong with setTimeout. You can examine this yourself by having your updateMsg() do something visible when it runs, other than start that Ajax request; do an alert() or change the color of a box on the page, or something.

The most obvious problem you have, if this is the code you're running, is that your callback function from the Ajax call is empty, so isn't doing anything.

It probably isn't reaching setTimeout(). Put an alert() in there.

Also, you should have setTimeout() inside the callback function. Otherwise if the HTTP requests take too long, you'll start doing multiple HTTP requests will the old ones are still pending. This wills surely crash the server if it is already overloaded or build up the HTTP request queue in the browser if you go over the limit (usually its two separate requests at a time)

Putting setTimeout() inside the callback makes sure the calls are synchronous/linear. So you only have one HTTP request at a time.

ie:

function updateMsg()
{
$.ajax({
        url:"db.php",
        type:"POST",
        success:function(data){
        }
});
setTimeout("updateMsg()",7000);
}

Should be:

function updateMsg()
{
$.ajax({
        url:"db.php",
        type:"POST",
        success:function(data){
          // after processing your stuff


          // make sure the next request is linear
          setTimeout("updateMsg()",7000);
        },
        fail: function() { /* handle your failed reqeust */ }
});

}

That doesn't solve your problem, but it will solve problems you'll have later on. You'll also need to handle failed requests.

It is different than i first started but hey that is programming javascript a function to update messages on screen.

  var last_msg_id = 0;
  function updateMessage()
  {
$.ajax({ 
    type: "post", 
    url: "db.php",
    data : {MsgNo :last_msg_id},
    dataType: "xml" ,
    success: 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_id = $(this).find("from_group_id").text();    
            var from_group = $(this).find("from_group").text();
            var from_grp_abr = $(this).find("from_grp_abr").text();
            var from_kind = $(this).find("from_kind").text();
            var row_bg_clr = $(this).find("from_bg_color").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 to_group_id = $(this).find("to_group_id").text();
            var to_grp_abr = $(this).find("to_grp_abr").text();
            var to_bg_color = $(this).find("to_bg_color").text();
            var to_kind = $(this).find("to_kind").text();
            var msg_type = $(this).find("msg_type").text();
            var msg = $(this).find("msg").text();
            var onlydate = getonlydate(date_time);
            var class_flag = ($(this).find("flagged").text() == 'true') ?    'flagged' : 'unflag';

            var reply = (to_group_id == $("#group_id").val()) ? 'reply' : '';

            var handle_reply = (from_user == "") ? from_grp_abr : from_user;
            //var styleclass = (8)? 'smoke' : 'blue';

           if (from_kind == 3)
           {
             var centerDiv = 'centerPopup(event,"changeObsLabel");';
             var change_label = 'change_label('+msg_id+',"'+msg_type+'","changeObsLabel");';
           }
           else if (from_kind == 4)
           {
             var centerDiv = 'centerPopup(event,"changeUserLabel");';
             var change_label = 'change_label('+msg_id+',"'+msg_type+'","changeUserLabel");' ;
           }
           else 
           {
             var centerDiv = 'centerPopup(event,"changeAnimLabel");';
             var change_label = 'change_label('+msg_id+',"'+msg_type+'","changeAnimLabel");' ;
           }

            var html = "<tr class='active' style='background-color:#"+row_bg_clr+"' id='row_"+msg_id+"'>";
            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 id='type_of_msg_"+msg_id+"' class="+msg_type+" onclick="+centerDiv+change_label+"> <\/a><\/td>";
            html += "<td><a id='flag_"+msg_id+"' class='"+class_flag+"' onclick=\"flagMsg("+msg_id+",'"+row_bg_clr+"')\">  <\/a><\/td>";
            html += "<td>"+msg+"&nbsp;"+"<span style='color:gray'>["+msg_id+"]</span><\/td>";
            html += "<td>"+from_grp_abr+"<\/td><\/tr>";

            $("#tbody1").prepend(html);
              //append data to tab2 messages received
             if (to_group == $("#login").val())
             {
               $("#tbody2").prepend(html);
             }

             //append data to tab3 sent messages
             else if (from_group == $("#login").val())
             {
               $("#tbody3").prepend(html);
             }

             if (class_flag == 'flagged')
             {
               $("#tbody4").prepend(html);
             }

             if(to_kind == 3 || from_kind == 3){
                $("#tbody5").prepend(html);
             }

             if(from_group != $("#login").val())
             {
               $("#tbody"+from_group).prepend(html);
             }

             if(to_group != $("#login").val())
             {
               $("#tbody"+to_group).prepend(html);
             }

             last_msg_id = msg_id;
        });
        alternateRows();
        setTimeout('updateMessage()', 3000);
  },
    error: function(){
        setTimeout('updateMessage()', 3000);
    },
    async: false
});
 }

a function to insert in database new messages

function addMessages()
{
 if(document.getElementById('name').value == "")
{
    alert("Missing a sender");
}
else if (document.getElementById('user2').value == "")
{
    alert("Missing a receiver");
}
else if (document.getElementById('msg').value == "")
{
    alert("Missing a message");
}
else {
$.ajax({
    url:'insert.php',
    type:'post',
    data:{name: $("#name").val(), from_user_id:$("#from_user_id").val(),from_grp_id:$("#from_grp_id").val(),user2: $("#user2").val(), to_user_id: $("#to_user_id").val(),to_grp_id:$("#to_grp_id").val(), message:$("#msg").val(), label:$("#label").val()},
    success:function(data)
    {
      if (data == 'new user')
      {
        checkNewRole();
        $("#name").val("");
        $("#user2").val("");
        $("#msg").val("");
        $("#label").val("empty");
      }
      else 
      {
       $("#name").val("");
       $("#user2").val("");
       $("#msg").val("");
       $("#label").val("empty");
      }
    }
});
  }
 }

As for php it remained more or less the same.