Вопрос по callback – Как заставить Meteor.Call вернуть значение для шаблона?

41

Я пыталсячтобы понять этот пост относительно этой концепцииоднако я не могу его получить. У меня есть следующие простые настройки:

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

Эта структура возвращается в консольundefined.

Если я изменюmyapp.js подать в:

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

Я получаюObject в моей консоли.

В идеале это то, что я хотел бы сделать, но это не работает, указав в консоли:Cannot read property 'greeting' of undefined

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

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

Любая помощь в передаче данных из объекта сервера в шаблон будет принята с благодарностью. Я все еще изучаю JavaScript & amp; Метеор.

Спасибо!

Ваш Ответ

4   ответа
0

ия в шаблоне, используяреактивная переменная, Проверьтерабочая демонстрация на Meteorpad

Пример в Meteorpad не работает для меня. Кроме того, развертывание примера работает ... вроде. То есть он работает один раз, но для меня метод не вызывается при обновлении базовой информации.
Методы сами по себе не являются реактивными, но их можно вызывать из реактивного контекста, такого как Template.instance (). Autorun () или помощники шаблонов.
1

Npm.require имеет асинхронное поведение Это причина того, что вы должны написать обратный вызов дляMeteor.call.

Но есть решение, просто используйтеinstall(mrt add npm) и вы получите функцию с именемMeteor.sync(//...) с этим вы можете сделать обе игры: синхронизировать и асинхронно в вашемMeteor.call().

Ссылка:http://www.sitepoint.com/create-a-meteor-app-using-npm-module/

77

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.

Итак, вы хотите сделать это следующим образом:

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

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

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

Это будет реактивно обновлять шаблон, как только будут доступны данные.

Error: User Rate Limit Exceeded
Error: User Rate Limit ExceededundefinedError: User Rate Limit Exceeded
Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded);Error: User Rate Limit ExceededTemplate.hello.greetingError: User Rate Limit Exceeded rs77
Error: User Rate Limit Exceeded
0

что важно для меня. Ниже приведен мой код, который, как мне кажется, в принципе решает проблему ОП.

В файле main.js клиента:

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

}, 5000); 

Это запускает функцию verifyLogin () каждые пять секунд.

Функция verifyLogin (в main.js клиента):

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

}

Метод loggedIn (в main.js сервера):

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

    return toReturn;
},

Соответствующий помощник:

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

Похожие вопросы