2

在我的工作中,我为 Web 应用程序编写代码,因此新代码会相对频繁地推送到服务器。但是,我们遇到了一个问题,该应用程序的一些用户倾向于将其在浏览器窗口中打开长达数天。然后他们遇到了这个问题:

  1. 他们将数据输入到上周仍在他们机器上运行的应用程序中。
  2. 他们试图保存他们的数据,但有时这不起作用,因为服务器上的代码比他们本地机器上的代码更新(即,他们客户端上的 JavaScript 发送的数据与服务器上的新代码不同预计)。
  3. 他们不能简单地刷新页面以重新下载已更改的 JavaScript 代码,否则他们会丢失数据。

处理这种情况的正确方法是什么?我当然想到了明显的解决方案,比如只是告诉这些用户不要这样做,或者永远不要更改我的 AJAX API,这样请求就不会失败,但我希望有更好的方法来处理这个问题。

特别是,我们的环境由服务器上的 PHP、客户端上的 JavaScript 和用于管理源代码的 git 组成。我并不特别担心支持旧版本的 IE 等(至少在这个问题上)。

4

2 回答 2

2

在过去,我通过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);
于 2013-11-06T02:08:33.227 回答
1

我会尽量减少从客户端传递到服务器的数据中的重大更改。现在,我并不是说您不能对 API 进行更改。只是所做的任何更改通常应该与以前的版本向后兼容。一般来说,这意味着如果 API 端点采用一些参数并且您想更改它们,如果可能的话,您应该

  1. 忽略您不关心的参数(因为当您删除了必要的参数,但旧客户端仍在结束它时);和
  2. 为未提供的数据提供合理的默认值(添加参数时)。

类似的事情适用于从服务器发回的数据:客户端应该忽略它无法识别的东西,并在它没有得到预期的东西时应用合理的默认值。这本质上是稳健性原则:“发送的内容要保守,接受的内容要自由。”</p>

当然,这不是一个巧妙的解决方案,但如果做得好,它会运行得很好,并使您的软件更加健壮。

虽然无法替代适当的稳健性,但您可能还需要考虑version在所有响应中提供一些标签。如果用户刚刚保存了一些数据(所以刷新是安全的)并且接收到version的与客户端脚本中嵌入的不同version,那么刷新页面并不是不合理的。但这并不能替代稳健性。

于 2013-11-06T05:59:00.027 回答