javascript - 定期刷新或轮询

标签 javascript asp.net usability

我正在尝试通过 XMLHttp(XHR) 在我的网站上使用定期刷新(ajax)/轮询来检查用户是否每 10 秒在数据库上有一条新消息,然后如果有则通过创建一个通知他/她像这样动态地div:

function shownotice() {
    var divnotice = document.createElement("div");
    var closelink = document.createElement("a");
    closelink.onclick = this.close;
    closelink.href = "#";
    closelink.className = "close";
    closelink.appendChild(document.createTextNode("close"));
    divnotice.appendChild(closelink);
    divnotice.className = "notifier";
    divnotice.setAttribute("align", "center");
    document.body.appendChild(divnotice);
    divnotice.style.top = document.body.scrollTop + "px";
    divnotice.style.left = document.body.scrollLeft + "px";
    divnotice.style.display = "block";
   request(divnotice);
}

这是一种可靠或稳定的方法来检查消息,特别是因为当我查看 firebug 时,大量请求正在发送到我的数据库?此方法是否会因请求过多而导致我的数据库关闭?有没有其他方法可以做到这一点,因为当我登录 Facebook 并在 Firebug 下检查时,没有发生或正在进行任何请求,但我知道他们也在使用定期刷新......他们是如何做到这一点的?

最佳答案

您可以每 10 秒检查一次新数据,但您需要进行影响较小的检查,而不是检查数据库。

我要做的是修改数据库更新过程,以便当它对某些数据进行更改时,它还会更新文件上的时间戳以显示最近发生的更改。

如果您想要比“数据库中某处发生更改”更好的粒度,您可以按用户名(或其他标识符)对其进行分割。然后,要更新的文件将是可能对更新感兴趣的每个用户的用户名。

因此,当您的脚本询问服务器是否有比时间 t 更新的用户 X 的信息时,服务器端脚本可以将文件的时间戳与时间参数进行比较,而不是进行数据库查询,看看是否有数据库中有任何新内容。

在更新数据库的过程中,添加代码(大致)执行以下操作:

foreach username interested in this update
{
    touch the file \updates\username
}

然后您查看是否有新数据的函数如下所示:

function NewDataForUser (string username, time t)
{
     timestamp ts = GetLastUpdateTime("\updates\username");
     return (ts > t);
}

一旦发现有新数据,您就可以执行完整的数据库查询并获取所需的任何信息。

关于javascript - 定期刷新或轮询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1682175/

相关文章:

javascript - 仅在部署时出现 Meteor iron-router 闪屏错误

javascript - this.$el.html 与 this.$el.append

asp.net - 在 typeof 上使用 instanceof 时出现 "Too much recursion"错误?

security - 记住我 - 持续时间应该有多长

javascript - 访问引号内的函数

javascript - Firebase orderByChild 不适用于时间戳

html - <hr> 在页脚上方的页面底部

c# - 在 SQL 中使用 join 检索不同记录

user-interface - 应用程序什么时候可以成为游戏?

ide - IntelliJ IDEA 关闭未保存的选项卡