2017-09-26 11 views
2

私は時間ベースの派生プロパティを持つオブジェクトのセットを持っています。"競合する" firebaseの雲の機能を防ぐには?

プロパティを計算するための作成と書き込みをリッスンしているFirebaseクラウド機能があり、うまくいきます。

また、cronのようにHTTPでトリガーされる関数を追加して、日曜日の朝早くプロパティを再計算します(このプロパティは毎週変更されます)。

これはうまくいきますが、cron関数がプロパティを更新するたびに、最初の関数が書き込みをキャッチし、計算全体をやり直します。

これを防ぐ簡単な方法はありますか?私はcronが動作しているかどうかを検出する最初の関数の環境変数を設定してみましたが、実行時に環境変数を設定することはできません。

+0

なぜcronジョブが必要ですか?最初の関数は、更新に関する計算を行います。 –

+0

派生したプロパティに入る要因の1つが週ごとのサイクルに基づいているため、cronジョブが必要です。したがって、派生したプロパティは、ユーザーの更新やカレンダーの変更に基づいて変更される可能性があります。 – funkju

+0

cronジョブは、最初の機能を起動するノード(たとえば、「更新」と呼ばれる)への書き込み/更新を実行するだけかもしれません。 :-) –

答えて

2

これを防ぐには、以前の値をチェックする必要があります。私は、以前の値がその変数timeは自分の他の機能によって変更された現在の値と同じでない場合要約する例に

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

を提供しようとするでしょう。 .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"関数の後にもあります)。これらの2つの値が同じでない場合は、トリガーが "cron"関数で設定されていることがわかりますそれを無視してください。時間値が変更されていない他の書き込みの場合、関数は期待どおりに機能します。 – DoesData

+0

ああ、あなたがしていることを見ています。 – funkju

関連する問題