流星观察变化不止一次改变了火焰

时间:2017-07-24 16:21:14

标签: mongodb meteor

此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

1 个答案:

答案 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 ) { ... }

此致 保罗