説明するのが完全に途方に暮れているという奇妙な問題があります。問題を説明するために、Web アプリケーションのこの特定の部分のフローを説明する必要があります。
1 つのデバイスを想像してみてください。この場合は、最新のブラウザーを実行しているデスクトップ PC です。このユーザーが接続されると、マスターとして機能します。このマスターは、次のように JavaScript で現在の時刻を取得します。
get_time : function() {
var d = new Date();
return d.getTime() - this.cache.start_time;
//We have tried using the modern Date.now method also but to no avail
//return Date.now() - this.cache.start_time;
},
この時間は websocket を介して node.js に送信され、この特定のストリーム用に一時的にサーバー側に保存されます。
ここで、携帯電話、タブレット、その他のデスクトップ コンピューターが混在する、他のいくつかのデバイスを想像してみてください。これらのデバイスは本質的にマスターのスレーブになるため、時間ごとに同期する必要があります。これを実現するために、これらのスレーブが接続すると、node.js サーバーstart_time
はこのストリームのマスターからの保存をスレーブにプッシュします。
this.cache.start_time
上記の関数で見られるように、この変数はプロパティになります。
この開始時間から、スレーブのブラウザの現在の時間を開始時間から差し引くことにより、シンコペーションが行われます。
これを行う必要がある理由は、この質問とは関係がないため、省略します。ただし、マスターが現在処理しているものとまったく同じ配列インデックスで開始する必要がある、各スレーブで進行中の処理があることを説明することによって、少し詳細を追加します。start_time
マスターとそのすべてのスレーブ間で変数を同期することにより、正しい配列インデックスを取得し、そこから時間ベースの処理を開始できます。
私が抱えている問題は、モバイル Safari (私は iOS 6 と iOS 7 beta2 をテストしました) を除いて、試したすべてのブラウザーで、すべてのスレーブがマスターと完全に同期することです。
上記のコードでわかるように、Date.Now()
代わりにメソッドを使用してみましたが、役に立ちませんでした。node.js を監視すると、サーバーが正しいものstart_time
を iPhone にプッシュしていることがわかりますが、モバイル サファリで変数を変更すると、毎回数秒異なる結果が得られるようです。
さらに難しいことに、私は現在 Apple コンピュータにアクセスできないため、モバイル Safari を適切にデバッグして何が起こっているのかを理解することができません。
私は完全に途方に暮れており、Apple の javascript Date 実装が他のブラウザーに異なる結果を返す理由または方法を理解できません。意味がありません。
モバイル Safari の操作に関して、私が気付いていないことはありますか? JavaScript で現在の時刻を取得する Apple の方法との既知の違いはありますか? ブラウザ間で一貫した現在時刻を正確に収集する方法について、他に提案はありますか?
提案やアドバイスをお寄せいただきありがとうございます。
編集: 私はかなり冷静な考えを持っていました. JavaScript で時刻を取得するとき、クライアントのシステム クロックを使用しますか? 彼らが数秒でも出ていれば、これは不正確になるということですか? つまり、Master の時刻は 16:31:22 であるのに対し、iPhone の時刻は 16:31:16 である可能性があります。
その場合、これらのデバイスを同期する最善の方法について完全に再考する必要があります. それが本当に違いの理由である場合、私はもちろんそれを答えとして受け入れます.