2017-07-24 42 views
0

這個流星服務器代碼在myArray.length === 3時只需調用myFunc()一次,但它不止一次被觸發。它如何被修復? thx流星觀測變化不止一次改變了火焰

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

回答

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 

如果你需要的動作是服務器端,你的方法可以調用服務器端方法(這是發送電子郵件的典型情況)。

只是爲了記住那種,如果這$ addToSet不會,改變你的數組的長度,如果數組Mongo $addToSet

我個人更喜歡做很多事情就像在電子電路中存在的價值。 ..只是爲了確保我不需要在項目中實施多種不同的邏輯。我不確定這裏的「線框」原理是否適用於您。

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

問候, 保羅

+0

我已經改變了代碼,以反映使用超時是'原因:

您也可以通過「如果」的功能合併2簡化上面的代碼myArr.length'可能永遠不會大於3,但只要給它15秒以允許其長度由某些ddp邏輯改變即可。 –

+0

不確定你是否仍然有這個問題。我看到的是,您觀察到myCol中名稱按名稱找到的更改,「myFunc」造成的更改。然後你調用一個函數ddpCall(doc),它改變了同一個集合上的記錄。是否有可能你有一個重疊的地方,這樣你可以改變同一文件兩次,一旦找到'name',然後找到_id:myCol.update({_ id:....})找到的同一個文件? –