Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/365.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何将此ajax代码更改为长轮询_Javascript_Ajax_Long Polling - Fatal编程技术网

Javascript 如何将此ajax代码更改为长轮询

Javascript 如何将此ajax代码更改为长轮询,javascript,ajax,long-polling,Javascript,Ajax,Long Polling,这是我的ajax代码,请告诉我如何将此代码更改为长轮询 这是我的密码:- var chat = {} chat.fetchMessages = function () { $.ajax({ url: 'ajax/ajax/chat.php', type: 'POST', data: { method: 'fetch' }, success: function(data) { $('#chats').html(data); } });

这是我的ajax代码,请告诉我如何将此代码更改为长轮询

这是我的密码:-

var chat = {}
chat.fetchMessages = function () {
  $.ajax({
    url: 'ajax/ajax/chat.php',
    type: 'POST',
    data: { method: 'fetch' },
    success: function(data) {
      $('#chats').html(data);
    }
  }); 
}
chat.interval = setInterval(chat.fetchMessages, 1000);

您必须将fetchMessage的下一个调用放在上一个调用的回调中:

var chat = {}
chat.fetchMessages = function () {
  $.ajax({
    url: 'ajax/ajax/chat.php',
    type: 'POST',
    data: { method: 'fetch' },
    success: function(data) {
      $('#chats').html(data);
      chat.fetchMessages(); // let's do it again
    }
  }); 
}
chat.fetchMessages(); // first call

上面的代码似乎工作正常,但这会立即调用函数,因此会增加通信量,并且可能会增加浏览器对连续长轮询内存的使用。尝试使用settimeout在两次调用之间保持一定的持续时间,如果您也清除了缓存,这将是很好的。另一个选项是comet或signaR。

请注意,您可能希望在通话中设置某种时间延迟(即,包装递归的
chat.fetchMessages()
设置超时
函数中。否则,由于ajax请求的打开和关闭连接过载,您可能会降低整个服务器环境的速度和/或使其崩溃。@War10ck谢谢您的帮助,但我照您说的做了,没有发生任何新的事情。发送请求(这是我的新任务)甚至会更快e:-var chat={}chat.fetchMessages=function(){$.ajax({url:'ajax/ajax/chat.php',type:'POST',data:{method:'fetch'},success:function(data){$('fetchMessages').html(data);$('chatsher').scrollTop($('ajax/ajax/chatsher')[0]。scrollHeight);setTimeout(chat.fetchMessages(),30000)}}}chat.fetchMessages()@Magikano尝试删除
setTimeout
语句中的
()
。它应该是
setTimeout(chat.fetchMessages,30000);
。当前编写时,函数将立即作为左括号进行计算
()
表示函数调用。在这种情况下,不应立即计算函数,而应将其作为
setTimeout
函数的回调。请查看这个说明这一点的简单示例。@War10ck感谢您的重播,我做了您所说的,但它也会每隔一秒收到请求chat.php,然后在1秒chat.php ant之后这就是我不想要的,我想让它等到数据库中出现新的东西,然后它会收到一个请求,我认为长时间轮询对我来说就可以了!@Magikano让我看看我是否在跟踪你。你只想在新的聊天数据可用时发出ajax请求吗?听起来你想要的是推送服务。推送服务就是其中之一客户端处于空闲状态。当服务器获得新信息时,它会自动将其推送到接收信息的客户端并采取相应的操作。不幸的是,我只读过此类技术。我从来没有实际编写过它们。很抱歉,伙计,这几乎是我对推送技术的知识范围。另外,这是ame正如你1小时前提出的问题-?如果是这样,你应该修改你原来的问题,而不是再问一次-好吧,我不想让它每秒钟都在问一次,我想让它在有新消息的时候带来所有新消息,我试图学习comet,但我发现它非常混乱,很难使用,所以我想让它成为现实使用长轮询,因为我认为它更容易!正如我所说的,它可能会不断增加浏览器内存使用量,导致浏览器崩溃。任何其他选择都可以是sheepjax。是的,因为这是短轮询,但如果是长轮询,它会更好,对吗?