2014-11-14 26 views
1

延遲補償是向用戶顯示即時反饋而不必等待服務器更新通過並消除關鍵時間延遲的一個很好的技巧。當服務器上的流星方法失敗時,我們如何使用延遲補償?

但是在很多情況下,服務器方法可能存在問題,更新/插入可能會失敗。因此,當服務器方法有可能因任何原因失敗時,延遲補償成爲這些情況下的問題。在這種情況下,向用戶顯示立即效果,然後回滾是非常具有誤導性的。

那麼我們如何在不解決此問題的情況下使用延遲補償?

回答

2

一種解決方案是,如果服務器往返呼叫佔用X毫秒以上,則使用類似微調指示器,表明顯示器將被視爲「臨時」。如果server method call確實返回,指標可能會變成✔複選標記。

這就是爲什麼流星有一個稱爲方法存根的特徵。如果您在客戶端上定義了一個與服務器方法同名的方法,Meteor將運行它來嘗試預測服務器方法的結果。當服務器上的代碼實際完成時,客戶端上生成的預測將替換爲服務器方法的實際結果。

失效(如在由服務器返回明確的錯誤)應通過拋出error message,而被斷開應顯示connection status消息的客戶端從網絡錯誤區分。

+0

是的我可以想象,在大多數情況下,它可以正常工作,但服務器更新可能會失敗。那麼這不會造成不一致的狀態?那麼如果有可能會失敗,我們如何安全地使用它? 我可以看到,顯示覆選標記和微調是一種體面的方式來顯示正在進行的更新,但它仍然給人一種感覺,即正在發生的事情對於用戶體驗而言不一定足夠光滑。如果它失敗了,那麼我們會拋出一個錯誤信息而不是複選標記? – srinivas

+0

應該區分故障(如服務器返回的顯式錯誤)和網絡錯誤。如您所說,失敗應該會導致[錯誤消息](https://atmospherejs.com/?q=flash+error),而斷開連接的客戶端應顯示[連接狀態](https:// atmospherejs。 com /?q =連接+狀態)消息。更新了我的答案。 –

+0

謝謝@Dan Dascalescu。在使用延遲補償時,您是否有任何想法來優雅地處理服務器錯誤?讓我們看看同樣的例子,如果它通過,我們可以顯示一個複選標記,否則我們應該顯示一個'x'並顯示錯誤?在這種情況下,我並不完全相信用戶體驗。 – srinivas