Put another way:
Meteor.call() is always going to be expensive, because it has to access the network.
Collection.update(), etc are going to be both expensive and inexpensive, due to latency compensation, because it’s getting run on both client and server. It has to access the network to get to the server, so that call is expensive; but can access locally for the client which is inexpensive.
In this case, the first “Bob” came from the inexpensive
Collection.insert(), the second “Bob” came from the expensive
Collection.insert(), the first “Bob” was blocked from being removed because the expensive
Meteor.call() hadn’t resolved yet, and when it did finally resolve, latency compensation was able to finally remove the first “Bob”.
Meteor.call() in the callback allowed the following to happen: the first “Bob” came from the inexpensive “Collection.insert()”, the second “Bob” came from the expensive
Collection.insert(), when it arrives it replaces the first “Bob”, patches up the template, and then kicks off the “Meteor.call()” .