此Meteor客户端代码尝试使Tracker.autorun
运行一次,但因为它似乎必须运行两次,一次用于设置,一次用于反应。
哪个好,但是它开了3次。一旦设置和2响应,即使服务器仅更新user.profile.abc
一次。
为了测试它,我在mongodb控制台中运行此代码,附带的iamge是我得到的,它确认它会触发两次。
如何让它只运行一次以响应用户集合中的更改?感谢
db.users.update({_id: Meteor.userId()},{$set: {'profile.ABC': ['a','b']}}).pretty()
//client
Meteor.call('cleanABC', (err) => {
if (!err) {
ABCListener();
}
});
ABCListener: () => {
Tracker.autorun(() => {
if (Meteor.userId()) {
console.log('auto run invoked');
if (Meteor.user().profile.ABC) {
const myArray = Meteor.user().profile.ABC;
//myFunction(myArray);
console.log('condition true');
} else {
console.log('condition false');
}
}
});
}
//server
'cleanABC': function() {
return Meteor.users.update({
_id: Meteor.userId()
}, {
$unset: {
'profile.ABC': ''
}
});
}
//and some where else in the code
Meteor.users.update({
_id: userId
}, {
$set: {
'profile.ABC': myArray
}
}, (err) => {
if (!err) {
console.log('just sent the array');
}
});
答案 0 :(得分:1)
我认为问题是你每次调用方法时都只是调用Tracker.autorun。
我认为如果您将客户端代码更改为:
//client
ABCListener: () => {
Tracker.autorun(() => {
if (Meteor.userId()) {
console.log('auto run invoked');
if (Meteor.user().profile.ABC) {
const myArray = Meteor.user().profile.ABC;
//myFunction(myArray);
console.log('condition true');
} else {
console.log('condition false');
}
}
});
}
Meteor.call('cleanABC');
它应该有用。