Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to get Meteor.Call to return value for template?

I've tried to understand this post regarding this concept, however, I'm failing to get it. I have the following simple setup:

/server/test.js
Meteor.methods({ 
  abc: function() {
    var result = {};
    result.foo = "Hello ";
    result.bar = "World!";
    return result;
  }
});

/client/myapp.js
var q = Meteor.call('abc');
console.log(q);

This structure returns to the console undefined.

If I change the myapp.js file to:

Meteor.call('abc', function(err, data) {
  !err ? console.log(data) : console.log(err);
}

I receive the Object in my console.

Ideally this is what I'd like to be able to do, but it doesn't work, stating in the console: Cannot read property 'greeting' of undefined

/client/myapp.js
var q = Meteor.call('abc');

Template.hello.greeting = function() {
   return q.foo;
}

Any help in passing the data from the server object into the template would be greatly appreciated. I'm still learning JavaScript & Meteor.

Thanks!

like image 483
rs77 Avatar asked May 20 '12 21:05

rs77


2 Answers

From the Meteor.call documentation:

On the client, if you do not pass a callback and you are not inside a stub, call will return undefined, and you will have no way to get the return value of the method. That is because the client doesn't have fibers, so there is not actually any way it can block on the remote execution of a method.

So, you'll want to do it like this:

Meteor.call('abc', function(err, data) {
  if (err)
    console.log(err);

  Session.set('q', data);
});

Template.hello.greeting = function() {
  return Session.get('q').foo;
};

This will reactively update the template once the data is available.

like image 115
Tamara Wijsman Avatar answered Nov 17 '22 21:11

Tamara Wijsman


This happens because Npm.require has Async behavior. That's the reason that you have to write a callback for Meteor.call.

But there is a solution, just use install(mrt add npm) and you'll get a function named Meteor.sync(//...) with this you can do both games: sync and async in your Meteor.call().

Reference: http://www.sitepoint.com/create-a-meteor-app-using-npm-module/

like image 38
Jorge Ricaldi Pesantes Avatar answered Nov 17 '22 21:11

Jorge Ricaldi Pesantes