检查是否已填充Meteor.users订阅

时间:2014-04-23 16:50:19

标签: javascript meteor

如何验证Meteor.users集合是否准备就绪?

我有一些代码设置在客户端上运行Meteor(版本0.7.0.1)启动时运行不正常,因为Meteor.users集合尚未填充。在此代码中,Meteor.users._connection.status().connected返回true,DDP._allSubscriptionsReady()返回false,因此Meteor.users.findOne调用返回任何内容,即使它应该返回用户。

Meteor.startup(function() {
    Deps.autorun(function () {
        var userTracker = PersistentSession.get('userTracker');
        var userTrackerMissing = !userTracker;
        var anonymousUserMissing = !Meteor.users.findOne({"_id": userTracker});

        if (Meteor.users._connection.status().connected) {
            if (DDP._allSubscriptionsReady()) {
                if (userTrackerMissing || anonymousUserMissing) {
                    Meteor.loginAnonymously();
                }
            }
        }
    });
});

2 个答案:

答案 0 :(得分:0)

您可以尝试使用fast-render包。它使Meteor.users集合从一开始就被填充。运行:

mrt add fast-render

查看this detailed article如何运作。

答案 1 :(得分:0)

我能够使用像这样的标准Meteor设施来解决这个问题。在服务器上我发布了这样的用户。

Meteor.startup(function () {
    Meteor.publish("userData", function(userTracker) {
        var user = Meteor.users.find({_id: userTracker}).fetch();
        return Meteor.users.find({_id: userTracker},
            {
                fields:
                {
                    'votes': 1
                }
            }
        );
    });
});

在客户端上,我执行了以下操作以检查发布的userData是否可用。

Meteor.startup(function() {
    Deps.autorun(function () {
        var userTracker = PersistentSession.get('userTracker');
        var userTrackerMissing = !userTracker;

        var userReady = Meteor.subscribe('userData', PersistentSession.get('userTracker')).ready();
        if (userReady) {
            var anonymousUserMissing = !Meteor.users.findOne({"_id": PersistentSession.get('userTracker')});
            if (userTrackerMissing || anonymousUserMissing) {
                Meteor.loginAnonymously();
            }
        }
    });
});