1

m currently developing a chat aplication in php to a client using long polling. When the user send msgs i woud .abort() the getmsg() function and restart in on sendmsg() sucess (ajax call), but if the user send repeatedly msgs, the getmsg() get fired multiple times with same parameters, and if the other user is sending msgs too, i got repeatedly the same msgs. I got a way around it, without .abort() the getmsg() in sendmsg() it works well (ajax take care of both calls). But when the user send repeatedly msgs, i need to wait in the sleep() loop (getmsg()) to get all the msgs, even if there only a word in each. Is there a way to make the abort() fire just one time on consecutive msgs, or how i could make the sleep() to go lower (less seconds) when it finds a message? Wouldt it take so much of the server to do this check everytime? Thank提前了,抱歉文字太长。以下是功能:

PHP

getmsg() (a php file, this is the function)
$aa = mysql_num_rows($chatresult);
$togetmsg = 2;
while($aa == 0 && $tried_times < 6) {

sleep($togetmsg);
$chatresult = mysql_query("query"); 
$aa = mysql_num_rows($chatresult);
$tried_times++;
}

while($crow = mysql_fetch_assoc($chatresult))
{
 get the messages and put in a var/array;       

} 
json_encode the msgs

发送消息()

 Just a query to insert the textarea value in the table.

JAVASCRIPT

获取消息():

  jack = $.ajax({
        type: "POST",
        url: "getmsg.php",
        data: {friend_chatid: friend_chatid, msg_id: msg_id},
        dataType: 'json',
        context: this,
        async: true,
        cache: false,
        timeout:30000,

        success: function(html){      
            $(this).find(".div").append(message);
            msg_id = 0;

            var _this = $(this);     
            setTimeout(
                getmsg, /* Request next message */
                1000 /* ..after 1 seconds */
            );
        },
        error: function(XMLHttpRequest, textStatus, errorThrown){
         if(textStatus==="abort" || errorThrown==="abort") {
     //   alert(textStatus);
    } else {
            setTimeout(
                getmsg, 
                3000);
    }



        }
    });

发送消息()

$.ajax({
type: "POST",
url: "sendmsg.php",
data: {msg: msg, to: to},
context: this,
cache: false,
beforeSend: function () {
//   jack.abort(); // Commented cause i`m not using it now
$(this).val('');
    $(".div").append(msg); //

 },
success: function(html){
    //    getmsg(); // Commented cause i`m not using it now
  }
});  

它恢复了,我取出了附加数据部分,以使其更好地阅读。javascript 中的 sendmsg() 将 textarea 值附加到聊天中,当用户按 Enter 并且 textarea 有文本时,它们会使用 php 将其发送到数据库(我取出这部分以便更好地阅读)。getmsg() 进入 while 循环检查是否存在使用 mysql_num_rows 的 msg,如果有则回显它们。

4

1 回答 1

0

我认为可以使用clearTimeout. 试试这个代码。

功能sendmsg()

// define a variable named `pollQueue` outsode of your function
var pollQueue = false;

// send message
$.ajax({
  type: "POST",
  url: "sendmsg.php",
  data: { msg : msg, to : to },
  context: this,
  cache: false,
  beforeSend: function() {
    // Check if getmsg is in queue
    if ( pollQueue ) {
      // if so clear the queue
      clearTimeout( pollQueue );
    }
    if ( jack ) {
      jack.abort();
    }
    $(this).val('');
    $(".div").append( msg );
  },
  success: function( html ) {
    // add to queue
    pollQueue = setTimeout( getmsg, 3000 );
  }
});
于 2013-08-23T21:36:49.333 回答