MeteorJS连接延迟问题

时间:2017-09-23 05:05:38

标签: javascript meteor angular-ui-router

我对MeteorJS来说是全新的,只是看着演示并且四处寻找。我可能只是缺少一些非常基本的东西。 我正在使用带有角度ui路由器的meteor。如果我从一个将数据加载到控制器的状态开始,我会遇到问题,因为DDP还没有初始化。这类似于Meteor: How can I tell when the database is ready?

中描述的内容

路由配置的相关部分:

        resolve: {
            location: ($stateParams) => {
                console.log('find', $stateParams);

                let handle = setInterval(function () {
                    console.log(Meteor.status().connected, Meteor.status().status);
                    console.log( !!Locations.findOne({code: $stateParams.code}) ? 'found' : 'not found' );
                }, 100);

                setTimeout(function () {
                    clearInterval(handle);
                }, 2000);

                console.log(Meteor.status().connected, Meteor.status().status);
                return Locations.findOne({code: $stateParams.code});
            }
        }

,输出

false "connecting"
false "connecting"
not found
true "connected"
not found
true "connected"
not found
true "connected"
found
true "connected"
found

我的问题是: 我是否正确理解这里的问题是,为了使事情按预期工作,它们必须按照这个顺序发生:

  1. 启动Web套接字连接
  2. 可以使用网络套接字连接
  3. minimongo被刷新
  4. collection.findOne
  5. 和4.在3之前运行? 如果是的话,建议的解决方法是什么?

    交叉发布:https://github.com/meteor/meteor/issues/9127

1 个答案:

答案 0 :(得分:2)

每当您在Meteor中订阅时,您应该在呈现结果之前检查订阅是否为 ready 。通常情况下,你会显示一个微调器。

const mySub = Meteor.subscribe('somePublication');
if (mySub.isReady()) {
  ... you can access the data using minimongo
} else {
  ... not so fast Jack
}

在pub-sub可以传输数据之前,DDP的websocket连接需要启动,但在大多数情况下,这并不是非常重要的延迟来源。

您可以在Tracker.autorun()

中准备好发布时捕获事件
const mySub = Meteor.subscribe('somePublication');

Tracker.autorun(() => {
  if (mySub.ready()) ... do something
});

来自订阅的回调中的OR:

Meteor.subscribe('somePublication',() => {
  ... subscription is ready
});