在我的工作中,我为 Web 应用程序编写代码,因此新代码会相对频繁地推送到服务器。不过,我们遇到了一个问题,该应用程序的某些用户倾向于一次在浏览器窗口中将其打开长达数天。然后他们遇到了这个问题:
- 他们将数据输入到上周仍在其计算机上运行的应用程序中。
- 他们试图保存他们的数据,这有时会不起作用,因为服务器上的代码比他们本地机器上的代码更新(即,他们客户端上的 JavaScript 正在发送与新代码不同的数据在服务器上期望)。
- 他们不能简单地刷新页面来重新下载已更改的 JavaScript 代码,否则他们会丢失数据。
处理这种情况的正确方法是什么?我当然想到了明显的解决方案,比如告诉这些用户不要那样做,或者永远不要更改我的 AJAX API,这样请求就不会失败,但我希望有更好的方法来处理这个问题。
特别是,我们的环境由服务器上的 PHP、客户端上的 JavaScript 和用于管理源代码的 git 组成。我并不特别担心支持旧版本的 IE 等(至少在这个问题上)。
在过去,我通过一个不断轮询的脚本来解决这个问题,该脚本轮询 revision.txt
或服务器上的类似内容,其中的版本号在每次部署时递增。
当版本更改时,我要么弹出一条消息,表明他们需要刷新/禁用 UI,要么强制刷新它们(这通常很恶心,可能会让他们生气)。
类似这样的概念:
var createVersionChecker = function(seconds) {
var version = null;
var checkVersion = function() {
$.get('/version.txt', function(response) {
if(version == null) {
version = response;
return;
}
if(version != response) {
// do some logic to show the user that they need to refresh
// or force refresh them.. ick!
}
});
};
setInterval(checkVersion, seconds * 1000);
};
createVersionChecker(60);