我对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
我的问题是: 我是否正确理解这里的问题是,为了使事情按预期工作,它们必须按照这个顺序发生:
和4.在3之前运行? 如果是的话,建议的解决方法是什么?
答案 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
});