用户不刷新时更新Web应用程序

时间:2013-11-06 01:58:21

标签: javascript php

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

  1. 他们将数据输入到上周仍在其计算机上运行的应用程序中。
  2. 他们试图保存他们的数据,这有时是行不通的,因为服务器上的代码比本地机器上的代码更新(即,客户端上的JavaScript发送的数据与新代码不同)在服务器上预期)。
  3. 他们不能简单地刷新页面以重新下载已更改的JavaScript代码,否则会丢失数据。
  4. 处理这种情况的正确方法是什么?我当然想到了明显的解决方案,比如告诉这些用户不要这样做,或者只是从不更改我的AJAX API以便请求不会失败,但我希望有更好的方法来解决这个问题。 / p>

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

2 个答案:

答案 0 :(得分:2)

在过去,我通过持续轮询脚本来解决这个问题,该脚本在服务器上轮询revision.txt或类似内容,其中包含版本号,并在每次部署时递增。

当版本发生变化时,我会弹出一条消息,表明他们需要刷新/禁用UI或强制刷新它们(这通常是icky并且可能让他们发疯)。

像这个概念:

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);

答案 1 :(得分:1)

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

  1. 忽略您不关心的参数(当您删除必要参数时,但旧客户端仍在结束它);和
  2. 为未提供的数据提供合理的默认值(用于添加参数时)。
  3. 类似的东西也适用于从服务器发回的数据:客户端应该忽略它无法识别的东西,并在没有得到预期的东西时应用合理的默认值。这基本上是the robustness principle:“在你发送的内容中保守一点,在接受的内容中保持自由。”

    当然,这不是一个灵活的解决方案,但如果做得好,它可以正常工作,使您的软件更健壮。

    虽然没有替代正确的健壮性,但您可能还需要考虑提供一些version标记以及所有回复。如果用户刚刚完成保存一些数据(因此可以安全刷新)并且收到的version与客户端脚本中嵌入的version不同,刷新页面就不合理了。 但这并不能代替稳健性。