Javascript 定期刷新或轮询

Javascript 定期刷新或轮询,javascript,asp.net,usability,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;

我试图通过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下检查时,没有发生或正在进行任何请求,但我知道他们也在使用定期刷新。。。他们是如何做到这一点的?

这是非常不可靠的,而且在大多数情况下,服务器可能过于繁重

也许您应该看看推送接口:


我听说Comet是最具可扩展性的解决方案。

在大多数情况下,这是非常不可靠的,而且可能会对服务器造成太大的负担

也许您应该看看推送接口:


我听说Comet是最具可扩展性的解决方案。

我怀疑Facebook使用Flash电影(他们总是下载一部名为SoundPlayerWater.swf的电影)来与服务器进行通信。这不会被Firebug抓到(不过可能是Fiddler抓到的)。

我怀疑Facebook使用Flash电影(他们总是下载一部名为SoundPlayerWater.swf的电影),用来与服务器进行通信。这不会被Firebug捕获(不过可能是Fiddler捕获的)。

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

我要做的是修改db更新过程,这样当它对某些数据进行更改时,它也会更新文件上的时间戳,以显示最近有更改

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

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

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

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

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

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

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

我要做的是修改db更新过程,这样当它对某些数据进行更改时,它也会更新文件上的时间戳,以显示最近有更改

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

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

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

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

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

一旦你发现有新的数据,你就可以进行全面的数据库查询,并获得你需要的任何信息。

我在firebug运行的情况下打开了facebook,我大约每分钟看到一次请求,这对我来说似乎已经够多了


Comet使用的另一种方法是发出请求并保持其打开状态,服务器在不完成响应的情况下将数据运出客户端。这是一种黑客行为,违反了HTTP的所有原则:)。但它确实有效。

我在运行firebug的情况下打开了facebook,我大约每分钟看到一次请求,这对我来说似乎已经足够了


Comet使用的另一种方法是发出请求并保持其打开状态,服务器在不完成响应的情况下将数据运出客户端。这是一种黑客行为,违反了HTTP的所有原则:)。但它确实有效。

这不是一个更好的方法。因为即使没有真正的更新,您也会在每10秒钟查询一次服务器

您可以模拟服务器推送(or)方法,而不是这种轮询方法。这将完全减少服务器的工作负载,并且只有在服务器端有更新时才更新客户端

根据维基百科

反向Ajax指的是Ajax设计 使用长寿命HTTP的模式 连接以实现低延迟 web服务器与服务器之间的通信 浏览器。基本上,这是一种 将数据从客户端发送到服务器和 推送服务器数据的机制 返回浏览器


有关更多信息,请查看我对

的其他回复。这不是一个更好的方法。因为即使没有真正的更新,您也会在每10秒钟查询一次服务器

您可以模拟服务器推送(or)方法,而不是这种轮询方法。这将完全减少服务器的工作负载,并且只有在服务器端有更新时才更新客户端

根据维基百科

反向Ajax指的是Ajax设计 使用长寿命HTTP的模式 连接以实现低延迟 web服务器与服务器之间的通信 浏览器。基本上,这是一种 将数据从客户端发送到服务器和 推送服务器数据的机制 返回浏览器

有关更多信息,请查看我对