【问题标题】:How to change this ajax code to long polling [duplicate]如何将此ajax代码更改为长轮询[重复]
【发布时间】:2013-03-28 03:37:34
【问题描述】:

这是我的 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);

【问题讨论】:

标签: javascript ajax long-polling


【解决方案1】:

你必须将下一个 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

【讨论】:

  • 就像一个注释一样,您可能希望在调用上放置某种时间延迟(即将递归 chat.fetchMessages(); 包装在 setTimeout 函数中。否则,您将面临放慢速度的风险和/或由于 ajax 请求打开和关闭连接的过载而导致整个服务器环境崩溃。
  • @War10ck 谢谢你的帮助,但我照你说的做了,没有任何新的事情发生,它甚至更快地发送请求,这是我的新代码:- var chat = {} chat.fetchMessages = function () { $.ajax({ url: 'ajax/ajax/chat.php', type: 'POST', data: { method: 'fetch' }, 成功: function(data) { $('#chats').html (数据); $('#chatshere').scrollTop($('#chatshere')[0].scrollHeight); setTimeout(chat.fetchMessages(),30000); } }); } chat.fetchMessages()
  • @Magikano 尝试删除setTimeout 语句中的()。它应该是setTimeout(chat.fetchMessages, 30000);。正如当前编写的那样,该函数将立即被评估,因为左括号和右括号() 代表一个函数调用。在这种情况下,不应立即评估该函数,而是将其作为setTimeout 函数的回调。看看这个简单的fiddle 说明了这一点。
  • @War10ck 感谢您的重播,我按照您所说的做了,但它也会每隔一秒 chat.php 不断收到请求,然后在 1 秒后 chat.php 蚂蚁这就是我不想要的,我希望它等到数据库中出现了一些新的东西,然后它收到了一个请求,我认为长轮询会为我做的!
  • @Magikano 让我看看我是否在关注你。您只想在新的聊天数据可用时发出 ajax 请求?听起来您想要的是 push 服务。 push 服务是客户端保持空闲的地方。当服务器获得新信息时,它会自动将其推送给接收它并采取适当措施的客户端。不幸的是,我只读过这些技术。我从来没有真正编码过它们。抱歉,伙计,但这几乎是我对推送技术的了解。
【解决方案2】:

上面的代码似乎工作正常,但这会立即调用函数,因为这会增加流量,并且可能会增加浏览器的持续长轮询内存使用量。尝试使用 settimeout 来保持调用之间的一些持续时间,如果你也清除缓存会很好。其他选择是 comet 或 signaR。

【讨论】:

  • 好的,我不希望它每秒都在请求,我希望它在可用时带来所有新消息,我试图学习彗星,但我发现它非常混乱和困难使用所以我想通过长轮询来实现它,因为我认为它更容易!
  • 正如我所说,它可能会不断增加您的浏览器内存使用量,从而导致浏览器崩溃。任何其他选择都可以是sheepjax。
  • 是的,因为这是短轮询,但如果是长轮询会更好,对吧?
猜你喜欢
  • 2014-08-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-09-13
  • 2012-02-24
  • 2019-09-04
相关资源
最近更新 更多