Почему мой помощник не возвращает ничего полезного - он возвращает undefined

у меня есть этот код

/* Template Helpers Start */
    Template.ParticipationList.helpers({
        getAllParticipants: function(){
        var activityid = this._id;

        Meteor.call('participation.findParticipants', activityid, function(error, result){
            if(error){
                console.log(error)
            }
            return result;
        });

        }
    });

Если я помещаю массив и ключевое слово return вне вызова метеора, все в порядке — имена привязываются к шаблону. НО, когда это выше, ничего не привязывается к шаблону. Я думаю, что это как-то связано с асинхронностью... Но что я делаю не так.

ОБНОВИТЬ

 <ul>
    {{#each getAllParticipants}}
        {{name}}
    {{/each}}
</ul>

person K N    schedule 20.11.2016    source источник
comment
Всего несколько часов назад был задан почти идентичный вопрос.   -  person MasterAM    schedule 20.11.2016
comment
Так что решения проблемы не нашлось. Было сказано, что это проблема масштаба, но решения не было дано.   -  person K N    schedule 20.11.2016
comment
Не совсем. Все сводится к вашему дизайну. Нет особой пользы в вызове метода для каждого вызова помощника. Если вам нужно запустить вычисление, чтобы получить какое-то состояние, вероятно, есть лучшие способы сделать это. Методы не предназначены для выборки данных. Если вы хотите это сделать, вы можете настроить вычисление, например, для заполнения реактивного словаря, привязанного к шаблону.   -  person MasterAM    schedule 20.11.2016
comment
Возможный дубликат Как мне вернуть ответ от асинхронного позвонить?   -  person Quentin    schedule 20.11.2016


Ответы (1)


«Результат» не будет в данных. Это обычное асинхронное программирование. Что вы хотите делать с вашими данными? Вы можете поместить его в реактивную переменную для использования другими частями вашего приложения.

Meteor.call('myMethod', functoin(error, result){
  if(error){
    alert('Error');
  }else{
    Session.set("data", result)
  }
});

Я предполагаю, что вы хотите отобразить документы из коллекции, скажем, участники

Затем вы можете создать публикацию, разрешающую определенные поля.

e.g

Meteor.publish('allPartipants', function() {
  return Listings.find(
    {type: 'actors'},
    {fields: { name: 1, age: 1} }
  );
});

Подписка будет такой:

 Meteor.subscribe('allPartipants');

а в помощнике вам просто нужно вызвать коллекцию с помощью find().fetch() следующим образом.

Template.templatName.helpers({
   allParticipants(){
    Participants.find().fetch()
  }
})

и ваш html, как вы упомянули

 <ul>
    {{#each allParticipants}}
        {{name}}
    {{/each}}
</ul>
person hafiz ali    schedule 20.11.2016
comment
Я хотел бы вернуть результат, чтобы я мог привязать данные к шаблону. См. обновление выше для разметки шаблона. - person K N; 20.11.2016
comment
вам, вероятно, следует подписаться на сборник и публиковать только необходимые данные. и чем вместо того, чтобы заставлять meteor.call jst делать участников.find().fetch(), вы, возможно, не сможете использовать идентификатор активности, если у каждого из вас уже нет некоторого объема данных. - person hafiz ali; 20.11.2016