正如Abigail Watson在this谷歌小组讨论中解释的那样,数据库震荡是Meteor.js中出现的一种现象,但没有详细说明。似乎已经出现package来解决这个问题。
所以,我的问题是,Meteor.js中的“数据库抖动”是什么,以及在检查时如何影响我Deps.autorun()中的Meteor.user()?
编辑:我添加了一个令我头疼的代码示例,我认为这是由“数据库抖动”引起的。当用户登录时,Meteor.user()中的console.logs通常运行几次,与logout console.logs相同。在'userLoggedOut'中我正在重置Meteor.user()。profile.setAvailable布尔值,有时这会将我引入永久循环,因为if(Meteor.user())然后再次运行。这当然可能是我做错了......:)使用此代码时遇到此问题:
var lastUserId;
Deps.autorun(function () {
if(Meteor.user()) {
lastUserId = Meteor.user()._id;
console.log("USER LOGGED IN WITH USER ID", lastUserId);
if (Meteor.user().profile.setAvailable) {
Meteor.call('setAvailable',
{
options: Meteor.user()
.profile
.someDataThatShouldBeSetAvailable
});
}
if (Meteor.user().profile.forceLogOut) {
Meteor.call('resetForceLogOut',
{
userId: Meteor.user()._id
});
window.location.reload();
}
} else {
if (lastUserId) {
console.log("LOGOUT: We should do something
with this id", lastUserId);
Meteor.call('userLoggedOut',
{
userId: lastUserId
});
} else {
console.log("We don't have any lastUserId, the page
has probably been refreshed");
}
}
});
答案 0 :(得分:2)
这是众所周知的,因为用户似乎是分阶段发送的。最初是null
,然后是基本的(来自延迟补偿.setUserId
),然后从服务器接收实际数据。每次重新运行Deps.autorun
。
绕过它的方法是检查配置文件,以便只捕获最终的运行
更改此行
if(Meteor.user()) {
到这个
if(Meteor.user() && Meteor.user().profile && Meteor.user().profile.name
此处假设您.name
中有profile
字段,但您可以使用任何字段。如果你拥有它,它可能是其他任何东西。我们的想法是只等待有关用户的最后一块数据从服务器到达。