我在meteor-talk group中找到了答案。相應的代碼註釋可以發現here:
// After making a write (with insert, update, remove), observers are
// notified asynchronously. If you want to receive a callback once all
// of the observer notifications have landed for your write, do the
// writes inside a write fence (set Meteor._CurrentWriteFence to a new
// _WriteFence, and then set a callback on the write fence.)
以防萬一你想知道,看起來在實踐中 - 這是我做(在CoffeeScript中):
Future = __meteor_bootstrap__.require('fibers/future')
...
future = new Future
fence = new Meteor._WriteFence
fence.onAllCommitted ->
fence.retire()
future.ret()
result = Meteor._CurrentWriteFence.withValue fence, ->
# do something that triggers observers
...
return result
fence.arm()
future.wait() # This will return only /after/ all observers fired.
...
這是一個未記錄的功能,而不是保證從長遠來看能夠工作。因此,如果核心團隊想要描述官方解決方案,我的問題仍然存在。
這是延遲補償投入行動。爲了避免它,你可以使用'Meteor.call'和'Meteor.methods'。如果客戶端/服務器由於某種原因未同步,則該操作在客戶端反轉,並且在回調中引發錯誤。我也問過類似的問題http://stackoverflow.com/questions/14800971/meteor-latency-compensation-and-hinting-completion-commit-to-the-user – Akshat 2013-02-10 22:36:48
@Akshat:這個問題不是關於延遲補償或同步客戶端和服務器。它是關於node.js中的異步代碼執行(僅限於服務器)與瀏覽器中的同步代碼執行(僅限客戶端)。 Meteor通常使用光纖來「模擬」服務器上的同步行爲。但在這裏觀察員看來並不是這樣。我懷疑這是我忽略的一個很好的理由。 – jerico 2013-02-11 00:09:41
是的,我看到你已經編輯了這個問題來澄清這個問題,你能提供你用來顯示這種情況的代碼嗎? – Akshat 2013-02-11 00:11:55