我有一个ajax应用程序,客户端可能经常查找大量数据(例如按键),数据在服务器端由一个守护进程在固定时间每天更新一两次。为了避免频繁访问服务器,我将数据存储在一个xml文件中,因此客户端在页面首次加载时只需下载一次,然后通过javascript从本地数据文件查找数据。
但是用户可能会在更改之前不久加载页面,然后开始使用它而没有刷新页面,因此数据文件永远不会更新,因此告诉用户新数据不可用。
如何解决这个问题?
您应该为生成的XML文件设置适当的HTTP缓存头,这样任何在此时间之后的客户端请求都将获得新版本并在本地进行缓存,就像其他静态内容一样。
你说更新时间是固定的吗?那么,当用户在更新时间之前不久访问您的页面时,您可以将一个指示下一次更新还有多少分钟的JavaScript变量设置到您的页面,并运行客户端计时器,例如:
timer = { run:function () { 如果(now + minuteToUpdate > updateTime-startVisitTime){
// make ajax request here to update XML file
}
},
interval: //you can determine this since this will run in client-side
}
在这种情况下不要进行轮询,因为每次调用服务器都会浪费时间和造成压力。
您可以设置一些SESSION变量来帮助程序更好、更准确地运行。
Justin
一个明显的选项是添加一些 AJAX,每隔 x
分钟轮询服务器。如果数据需要刷新,只需在页面上某个明显的位置显示一个非阻塞消息,通知用户有新鲜数据可用,并提供一个链接来刷新页面。作为额外的功能,您可能希望为用户提供一个按钮,让他们自己检查新鲜数据(而不是等待 x
分钟过去)。
如果使用 HEAD 请求,您可以仅检查最后修改的标头。
运行时说...
或者,由于更新时间是固定的且不频繁,因此在提供XML的同时,还可以将缓存过期时间作为元素或自定义标头包含其中。这样,如果用户在XML更新的1分钟之前访问网站,则可以编写客户端以使其在超过该1分钟标记后进行缓存过期并在下一次请求之后更新。