此Meteor服务器代码只需在myArray.length === 3
时调用let name = 'john';
myCol.find({name: name}).observeChanges({
changed: function (id, fields) {
if (fields.myArr) {
if (fields.myArr.length === 3) {
console.log('setting time out for: ' + name); // <--- prints more than once
let doc = myCol.find({name: name});
setTimeout(Meteor.bindEnvironment(function () {
ddpCall(doc);
}), 15000);
} else if (fields.myArr.length === 4) {
ddpCall(doc);
}
}
});
let dppCall = function (doc) {
if (doc.search === 'required') {
myCol.update({_id: doc._id}, {$unset: {search: ''}});
ddpConn.call('myFunc', doc);
}
}
// some where else in the ddp call code
'myFunc': function () {
// some logic here which changes the myArr
myCol.update({name: name}, {$set: myObj, $addToSet: {myArr: myLabel}}); // push myLabel
});
一次,但它会被多次触发。怎么修好? THX
resources/views/admin/posts/create.blade.php
答案 0 :(得分:0)
我不确定你真的需要一个观察者。如果你有一个写入这个数组的方法,你为什么不在方法中做所有事情。如果有任何阻止操作,如发送短信或电子邮件,您可以使用Meteor this.unblock()。我提到了解锁,因为我看到你在那里使用了很长的超时。
当您使用具有相同名称的变量时,您可以跳过声明:
const name = 'john';
myCol.find({name})....
方法就像:
'meteormethod' with simple schema or validation etc and inside the method:
myCol.update({name}, {$set: myObj, $addToSet: {myArr: myLabel}})
const myArr = myCol.findOne({name}).myArr // hope 'name' is unique
if( myArr && myArr.length === 3 ) { fire what you need (with unblock if required) }
end of your method
如果您所需的操作是服务器端,则您的方法可以调用服务器端方法(这是通过电子邮件发送的典型案例)。
请记住,如果数组Mongo $addToSet中存在值,$ addToSet将不会更改数组的长度
我个人更喜欢在电子电路中做很多事情,如果这样......那只是为了确保我不需要在项目中实现许多不同的逻辑。我不确定“线框”原则是否适用于你。
此外,您可以通过合并2'if'函数来简化上面的代码:
if (fields && fields.myArr && fields.myArr.length === 3 ) { ... }
此致 保罗