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 に答える