【问题标题】:Is there a better way to create asynchronous updates without using setInterval?有没有更好的方法来创建异步更新而不使用 setInterval?
【发布时间】:2012-03-13 02:50:26
【问题描述】:

我的网站有多个部分每半秒检查一次更新,因此它可以提醒您有消息等。但是我觉得使用带有 setInterval 的 $.post 在网站上可能有点繁重。有没有更适合这些任务的替代方法?

【问题讨论】:

  • setInterval 绝对是设置异步定时事件的最佳方式。你说你有多个部分,每个部分都有自己的 POST 吗?这似乎是沉重的部分。最好让一个请求获取所有数据。
  • 你真的应该减慢这些请求的速度。每半秒触发一个 HTTP 请求实在是太过分了。 20-30秒更理智一点。使用 Web Sockets 是理想的选择。
  • 您可以增加间隔,这样就不会占用您太多的处理时间。以下是 Comet en.wikipedia.org/wiki/Comet_(programming) 术语下的方法
  • 是的,我就是这么想的,但是由于间隔的数量取决于您在页面上的位置(异步消息更新、侧边栏请求、各种通知等)所以我必须修改它很大程度上取决于您所在的页面,但是我可能最终还是会这样做,因为我认为额外的工作非常值得增加响应时间。谢谢。
  • @Ian:如果它对时间更敏感,那么轮询根本就行不通。您将需要使用长轮询或网络套接字——它们是为实时通信而构建的。

标签: javascript jquery ajax asynchronous


【解决方案1】:

是的,虽然这不是微不足道的。

更好的方法

您可以使用长轮询(或“彗星”),它会打开一个连接,使其保持打开状态 20 秒左右,然后立即重新打开它。服务器可以随时发送一些东西。

较新的浏览器提供 websockets,它提供持久连接。

两者的代码都相对复杂,因此您需要some kind of framework 为您处理事情。此外,需要为每个用户保持打开连接,因此它只适用于像 NodeJS 这样的轻量级工具。

更简单的方法

如果您想要更容易实现的东西,我建议您按照您的建议检查更新(它被称为短轮询,以将其与长轮询/websockets 进行对比)。你可以像这样做一个简单的轮询解决方案:

window.setInterval(function () {
  // More lightweight than $.post
  $.get('/datasource', function () {
    /* do something */
  }); 
}, 3000);

3 秒间隔have been used in used before by high profile people。

如果速度变慢,请尝试在 /datasource 中分析数据库查询

【讨论】:

  • +1 -- 长轮询/网络套接字确实是执行此操作的正确方法。另外,all the hard work is already done.
  • 感谢乔希的链接!确认这是一个很棒的框架,我的一个非常有能力的熟人正在成功地将它用于一些严肃的实时工作。
【解决方案2】:

socket.io 将是您使用nodeJS 的最佳选择。否则,请查看 this jQuery plugin,尽管不如 socket.io 全面,但它已经实现了优雅的降级。

【讨论】:

  • 不错的插件!你不需要一些轻量级的网络服务器吗?每个用户的胖 Apache/PHP 进程会迅速破坏服务器......
  • 取决于项目,大多数早期网站在任何时候可能只有 20-50 个用户。这并不意味着你不能扩展 PHP,看看 wordpress.com 或 facebook。
  • 当然你可以扩展 PHP... 我只是怀疑 websockets 和 PHP/Apache 并没有比长轮询和 PHP/Apache 更好。短轮询,当然,没问题。
  • 终于在几周前开始学习这个(大约在你推荐它之后的 4 个月),我很震惊我的网站的性能提升了多少。
猜你喜欢
  • 2015-02-03
  • 1970-01-01
  • 2023-03-06
  • 2019-03-22
  • 2019-09-03
  • 1970-01-01
  • 2012-01-20
  • 2019-01-12
相关资源
最近更新 更多