Подтвердить что ты не робот

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

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

/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 и Meteor.

Спасибо!

4b9b3361

Ответ 1

Из документация Meteor.call:

На клиенте, если вы не пройдете обратный вызов, и вы не находитесь в заглушке, вызов вернет undefined, и вы не сможете получить возвращаемое значение метода. Это потому, что у клиента нет волокон, поэтому на самом деле он не может блокировать удаленное выполнение метода.

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

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

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

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

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

Ответ 2

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

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

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

Ответ 3

Вы можете получить возвращаемое значение метода Meteor для использования в шаблоне с помощью реактивной переменной. Выполните демонстрационную демонстрацию на Meteorpad

Ответ 4

Я пошел на решение гетто. Но это работает для меня, что для меня важно. Ниже мой код, который, по идее, я думаю, решает проблему OP.

В клиенте main.js:

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

}, 5000); 

Выполняет функцию confirmLogin() каждые пять секунд.

Функция confirmLogin (в файле 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");
}