流星观测到变化不止一次改变火灾



此 Meteor 服务器代码只需要在myArray.length === 3时调用myFunc()一次,但它会被多次触发。如何修复?感谢

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 
});

我不确定你是否真的需要一个观察者。如果你有一个方法写入这个数组,为什么不在方法中做整个事情。如果有任何阻止操作,如发送短信或电子邮件,您可以使用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

如果所需的操作是服务器端,则方法可以调用服务器端方法(这是电子邮件的典型情况(。

请记住,如果数组中存在该值,$addToSet 将不会更改数组的长度 Mongo $addToSet

我个人更喜欢做很多事情,比如在电子电路中,如果这个......只是为了确保我不必在项目中实现许多不同的逻辑。我不确定"线框"原则是否适用于您。

您也可以通过合并 2 个"if"函数来简化上面的代码:

if (fields && fields.myArr && fields.myArr.length === 3 ) { ... }

问候 保罗

最新更新