This is due to data not being available when this code runs. With normal reactivity, when the data became avalable, this would rerun and you would get a have a cursor bearing data. The solution here would be to use the reactivity of a subcriptions ready() function to cause this code to execute once the data is available to the client.
You will always have data available on the server. The client however doesn’t have the data until it is transferred over a connection with varying speed and latency. this.ready() in the publish function won’t help here. You need to use the ready() function attached to the subscription handle that is returned from Meteor.subscribe. If you are using Blaze you can use template level subscriptions and the built in Template.subscriptionsReady to wait to render part of your template till data is available.
{{#if Template.subscriptionsReady}}
data dependent parts here
{{/if}}
If you are using react with createContainer then you can do something like this.
I know absolutely nothing about angular so I can’t say how this would be implemented but the jist of it is that since your fetch() is not reactive, ready() needs to run within the context of a Tracker computation so that that when it’s value changes it can invalidate the current computation and cause the function to rerun. With React, createContainer creates the needed context. Angular must have similar.