私は人間が特定の物事に費やす時間を記録するアンドロイドアプリを作成しています。私は合計時間に費やされた時間を追加したいので、ユーザーがエクササイズタイプにどれくらいの時間を費やしたか分かります 私はそれをトランザクションよりもやりたいと思っています。Firebase関数 - oldvalueに新しい値を追加する
ここで、firebaseがシャットダウンするまでこの関数がループすることがわかりました。
しかし、どうすればいいですか?これを行う簡単な方法はありますか?
私は人間が特定の物事に費やす時間を記録するアンドロイドアプリを作成しています。私は合計時間に費やされた時間を追加したいので、ユーザーがエクササイズタイプにどれくらいの時間を費やしたか分かります 私はそれをトランザクションよりもやりたいと思っています。Firebase関数 - oldvalueに新しい値を追加する
ここで、firebaseがシャットダウンするまでこの関数がループすることがわかりました。
しかし、どうすればいいですか?これを行う簡単な方法はありますか?
あなたは、データを更新したことを示すフラグを追加する簡単なオプションがあります。次回に関数に入るときは、そのフラグが存在するかどうかをチェックすることから始めて、関数を終了してください。これは、あなたが "onUpdate"と "onCreate"トリガーを持っていることを知っている最新の投稿によると、少なくともn + 1の機能を実行するということです。それらをスマートに使用してこれをさらに最適化することができます(たとえば、最初の作成時のみXYZを実行するので、各更新では実行されません)。
https://firebase.googleblog.com/2017/07/cloud-functions-realtime-database.html
は、あなたが言っているように、onWriteは、すべての書き込みイベントをキャプチャします。私の解決策はonWriteをonCreateに置き換えることですが、Firebaseが機能を引き続き起動させるため、別のパスに書き込むことができます。それ以外にも、更新が競合する可能性があるため、これは最善の解決策ではありません。トランザクションの使用はより良いです。これは次のようになります。
exports.addExerciseTime = functions.database.ref('users/{userid}/stats/exerciseTime/{type}').onCreate(event =>{
console.log("Exercise time updates...");
var newdata = event.data.val();
const pathToValue = //create the path here to exercisetime
return pathToValue.transaction(function(exercisetime) {
return (exercisetime || 0) + newdata;
});
});
* onWriteではなくonCreateイベントに注意してください。もう一度:他のパスに書き込む必要があります。