Como fazer com que Meteor.Call retorne o valor do modelo?
Pergunta
eu tentei para entender esse post sobre esse conceito, no entanto, não estou conseguindo entender.Eu tenho a seguinte configuração simples:
/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);
Esta estrutura retorna para o console undefined
.
Se eu mudar o myapp.js
arquivo para:
Meteor.call('abc', function(err, data) {
!err ? console.log(data) : console.log(err);
}
eu recebo o Object
no meu console.
Idealmente, é isso que eu gostaria de poder fazer, mas não funciona, informando no console: Cannot read property 'greeting' of undefined
/client/myapp.js
var q = Meteor.call('abc');
Template.hello.greeting = function() {
return q.foo;
}
Qualquer ajuda na passagem dos dados do objeto servidor para o modelo seria muito apreciada.Ainda estou aprendendo JavaScript e Meteor.
Obrigado!
Solução
De o Meteor.call
documentação:
No cliente, se você não passar um callback e não estiver dentro de um stub, a chamada retornará indefinido e você não terá como obter o valor de retorno do método.Isso ocorre porque o cliente não possui fibras, portanto não há como bloquear a execução remota de um método.
Então, você vai querer fazer assim:
Meteor.call('abc', function(err, data) {
if (err)
console.log(err);
Session.set('q', data);
});
Template.hello.greeting = function() {
return Session.get('q').foo;
};
Isso atualizará o modelo de forma reativa assim que os dados estiverem disponíveis.
Outras dicas
Isso acontece porque Npm.require
tem comportamento assíncrono.Essa é a razão pela qual você precisa escrever um retorno de chamada para Meteor.call
.
Mas existe uma solução, basta usar install(mrt add npm)
e você obterá uma função chamada Meteor.sync(//...)
com isso você pode fazer os dois jogos:sincronizar e assíncrono em seu Meteor.call()
.
Referência: http://www.sitepoint.com/create-a-meteor-app-using-npm-module/
Você pode obter o valor de retorno de um método Meteor para uso em um modelo usando um variável reativa.Confira a demonstração de trabalho no Meteorpad
Optei por uma solução de gueto.Mas funciona para mim, e é isso que importa para mim.Abaixo está o meu código, que, em conceito, creio, resolve o problema do OP.
No main.js do cliente:
Meteor.setInterval(function() {
confirmLogin();
}, 5000);
Isso executa a função confirmLogin() a cada cinco segundos.
A função confirmLogin (no main.js do cliente):
function confirmLogin() {
Meteor.call('loggedIn', function (error, result) {
Session.set("loggedIn", result);
});
}
O método logado (no main.js do servidor):
loggedIn: function () {
var toReturn = false;
var userDetails = Meteor.user();
if (typeof userDetails["services"] !== "undefined") {
if (typeof userDetails["services"]["facebook"] != "undefined") {
toReturn = true;
}
}
return toReturn;
},
O ajudante relevante:
loggedIn: function () {
return Session.get("loggedIn");
}