簡短回答,是的,即使日期插入,延遲補償也可以工作。但無論日期被插入到Minimongo客戶端,最終都會被服務器覆蓋。
的一系列事件看起來是這樣的:
- (客戶端)客戶端運行的版本的方法,插入
Date
到Minimongo posts
集合。假設客戶認爲它是04:31:03 UTC
,實際上它是04:33:44 UTC
。無論如何,現在你有一個文檔客戶端與一個「不正確」的時間戳。這是延遲補償的行動,這是好的 - 我們不會等待服務器完成插入,即使UI不正確,我們也會立即渲染UI。
- (服務器)同時,服務器被告知執行相同的插入。但服務器知道正確的時間,並將時間
04:33:44 UTC
插入到Mongo中。
- (客戶端)你的客戶可能訂購了
posts
收集,並立即服務器的插入完成後,您posts
訂閱觀察變化的收集和過DDP文件發送給客戶端。
- (客戶端) Minimongo將此新傳入服務器
posts
文檔與其自己的集合合併。在此過程中,它會使用正確的服務器生成時間覆蓋錯誤的時間。任何相關的用戶界面都會被動更新並反映這一變化。
基爾河建議一個MeteorPad,所以here's a very basic example。點擊「單擊我測試時間戳」,您會注意到它下面的毫秒顯示會閃爍兩次:第一次客戶端使用自己的時間戳進行更新,第二次使用ITS時間戳時服務器返回。如果您查看客戶端和服務器日誌,您會發現這是事實。
有點囉嗦,但希望這有助於!如果您需要的服務器信任並重新使用客戶端生成的日期,只需將Date
對象作爲參數傳遞給你的方法一樣
'method': function(date) {
check(date, Date);
Posts.insert({timestamp: date});
}
但是,您通常希望服務器是真理的來源你的時間戳。你永遠不能相信客戶知道什麼時候是真的!
MeteorPad在Meteor.isServer和Meteor的服務器端方法體中引入了一些虛假的延遲。setTimeout'在這裏可以回答這個問題。我稍後會看到關於製作一個。 –