2017-09-26 27 views
2

我有一組對象具有基於時間的派生屬性。如何防止「衝突」的Firebase雲功能?

我有一個Firebase雲端函數,它正在監聽創建和寫入來計算屬性,它運行良好。

我還添加了一個通過HTTP(如cron)觸發的函數,以便在週日清晨重新計算屬性(此屬性將每週更改一次)。

這工作正常,但只要cron函數更新屬性,第一個函數就會捕獲寫入,並重新執行整個計算。

有沒有簡單的方法來防止這種情況?我已經探索了爲第一個函數設置環境變量來檢測cron是否正在運行,但似乎並沒有在運行時設置環境變量。

+0

爲什麼你需要cron工作?第一個函數執行更新計算。 –

+0

cron作業是必需的,因爲進入派生屬性的因素之一是基於每週週期。所以派生屬性可以根據用戶的更新或日曆翻轉一週而改變。 – funkju

+0

因此,也許cron作業可能只是執行寫入/更新到一個節點(例如稱爲「更新」),這將觸發第一個功能。 :-) –

回答

2

您應該能夠通過檢查以前的值來防止這種情況。我會盡力提供一個例子

exports.yourFunction = functions.database.ref('/somepath/{someKey}').onWrite(event => { 
    if (event.data.previous.val().time != event.data.val().time) { 
    return; 
    } 
    else { 
    // perform calculation 
    } 
}); 

總之,如果以前的值是不一樣的當前值那麼變量time剛剛被你的其他功能變化。您需要將.time更改爲您的變量名稱。

注意:這不會阻止函數觸發,它只會阻止它再次執行計算。如果你不想讓函數觸發,你將不得不設計一種不同的計算方法。如僅計算它onCreate然後以設定的時間間隔使用Cron來更新值。收聽onWrite將導致該功能在每次將數據寫入Firebase時觸發。

您可以閱讀更多關於Firebase Database Triggers

+0

如果我理解正確,我不認爲你提出的建議會起作用。 「cron」是onWrite事件的觸發器,因此以前的值和事件值將根據需要而不同。對? – funkju

+0

「cron」函數將寫入數據庫。這觸發了雲端功能。 event.data.previous.val()。time =「cron」函數之前的值。 event.data.val()。time是觸發器之後的值(也是在「cron」函數之後的值),如果這兩個值不相同,那麼我們知道觸發器是由「cron」函數設置的,所以我們忽略它對於任何其他時間值未被更改的寫入,該函數將按預期執行 – DoesData

+0

啊,我明白你在做什麼,聰明。 – funkju