web-dev-qa-db-fra.com

Comment obtenir que Meteor.Call renvoie une valeur pour le modèle?

J'ai essayé de comprendre ce post concernant ce concept , mais je ne parviens pas à l'obtenir J'ai la configuration simple suivante:

/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);

Cette structure retourne à la console undefined.

Si je change le fichier myapp.js en:

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

Je reçois la Object dans ma console.

Idéalement, voici ce que j'aimerais pouvoir faire, mais cela ne fonctionne pas, indiquant dans la console: Cannot read property 'greeting' of undefined

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

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

Toute aide pour transmettre les données de l'objet serveur dans le modèle serait grandement appréciée. J'apprends encore JavaScript et Meteor.

Merci!

41
rs77

De la documentation Meteor.call :

Sur le client, si vous ne passez pas de rappel et que vous n'êtes pas dans un stub, call retournera undefined et vous ne pourrez pas obtenir la valeur de retour de la méthode. C'est parce que le client n'a pas de fibres, il n'y a donc aucun moyen de bloquer une exécution de méthode à distance.

Donc, vous voudrez le faire comme ceci:

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

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

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

Cela réactualisera le modèle une fois les données disponibles.

77
Tom Wijsman

Cela se produit parce que Npm.require a un comportement asynchrone. C'est la raison pour laquelle vous devez écrire un rappel pour Meteor.call

Mais il existe une solution, utilisez simplement install(mrt add npm) et vous obtiendrez une fonction nommée Meteor.sync(//...) avec laquelle vous pourrez faire les deux jeux: sync et async dans votre Meteor.call().

Référence: http://www.sitepoint.com/create-a-meteor-app-using-npm-module/

1

Je suis allé pour une solution ghetto. Mais cela fonctionne pour moi, ce qui est important pour moi. Ci-dessous est mon code qui, en principe, je pense, résout le problème de OP.

Dans le fichier main.js du client:

Meteor.setInterval(function() {
    confirmLogin();

}, 5000); 

Cela exécute la fonction confirmLogin () toutes les cinq secondes.

La fonction confirmLogin (dans le fichier main.js du client):

function confirmLogin() {
    Meteor.call('loggedIn', function (error, result) {
        Session.set("loggedIn", result);
    });

}

La méthode logsIn (dans le fichier main.js du serveur):

loggedIn: function () {
    var toReturn = false;
    var userDetails = Meteor.user();
    if (typeof userDetails["services"] !== "undefined") {
        if (typeof userDetails["services"]["facebook"] != "undefined") {
            toReturn = true;
        }
    }

    return toReturn;
},

L'assistant concerné:

loggedIn: function () {
    return Session.get("loggedIn");
}
0
MastaBaba

Vous pouvez obtenir la valeur de retour d'une méthode Meteor à utiliser dans un modèle en utilisant une variable réactive . Découvrez la démonstration de travail sur Meteorpad