MeteorJS Tracker:订阅后如何 return 一个值?

MeteorJS Tracker: How to return a value after subscription?

使用 Tracker.autorun() 方法遇到了这个问题:

Template.registerHelper('getUserName', (userId) => {

    let userName = '';
    Tracker.autorun((tracker) => {
        if (userId) {
            let subscription = Meteor.subscribe('userName', userId);
            if (subscription.ready()) {
                tracker.stop();
                let user = Meteor.users.findOne({_id: userId}, {fields: {emails: 0}});
                userName = user.services.facebook.name;
            }
        }
    });
    return userName;

});

我想 return 来自出版物的用户名,但是,范围很棘手,因为助手 return 是一个空字符串,而 Tracker 仍在订阅数据。

我试过这个:

Template.registerHelper('getUserName', (userId) => {

    let subscription;
    Tracker.autorun((tracker) => {
        if (userId) {
            subscription = Meteor.subscribe('userName', userId);
        }
    });
    if (subscription.ready()) {
        let user = Meteor.users.findOne({_id: userId}, {fields: {emails: 0}});
        return user.services.facebook.name;
    }

}); 

但是订阅还没有方法.ready()

关于如何在此处使用范围的任何想法?我记得闭包很有用。

我想你想将你的订阅从你的助手中移出。这最好留给在 onCreated() 函数中调用助手的模板。查看此 link 以获得帮助:http://guide.meteor.com/data-loading.html

所以你的助手看起来像:

Template.registerHelper('getUserName', (userId) => {
    let user = Meteor.users.findOne({_id: userId}, {fields: {emails: 0}});
    if( user && user.services && user.services.facebook) {
        return user.services.facebook.name;
    }
});

然后在你的模板中你会做:

{{#if getUserName currentUser}}
    <!-- Your code here. -->
{{else}}
    <!-- What to do if you don't have a user defined yet. -->
{{/if}}