8

onWriteハンドラでは、複数の読み込みを実行し、いくつかのデータを操作してから保存したいと思います。私はPromiseコンセプトをかなり新しくしています。 Firebaseが完了する前に私の質問を殺していないという点に関して、私は次の約束の取扱いで安全ですか?Firebaseのクラウド関数:約束をシリアライズ

exports.test = functions.database.ref('/zzz/{uid}').onWrite(event => { 
    console.log('zzz', event.data.val()); 

    return Promise.all([ 
     admin.database().ref('/zzz/1').once('value'), 
     admin.database().ref('/zzz/2').once('value') 
    ]).then(function(snaps) { 
     console.log('loaded', snaps[0].val()); 
     var updKeys = { 
      ["/xxx/" +event.params.uid +"/zoo"]: 'giraffe', 
     } 

     admin.database().ref().update(updKeys, function(error) { 
      console.log("Updating data finished. ", error || "Success."); 
     }) 
    }); 

}); 

上記の作品ではなく、必ずその正しい方法...

+0

なぜあなたが 'スナップ[1]'を使っていないときに '/ zzz/2'をリクエストしているのか不思議です...? –

+0

これは単なるテストです - 取り出されたデータの実際の(誤った)使用には気をつけないでください(またはハードコードされたuidを使用している醜い事実) – jazzgil

+0

'onWrite'コールバックから返ってきた約束が解決されています**最後に 'update'が完了する前に。それが意図的でない場合は、約束事を作成し、 'then'から返し、' update'コールバックで解決する必要があります。 –

答えて

7

あなたの機能は、それが戻ってきた後に実行を継続(またはあなたの関数の戻りが解決した約束)した場合、Googleクラウド機能はいつでもコードを中断することがあります。ただし、になるという保証はありません。

コードサンプルでは、​​最終then()の結果を返します。そのthen()ブロック内から何も返さないので、GCFはupdate()またはへの呼び出しを中断することがあり、必要以上にコードが実行される可能性があります。

「アップバブル」update()コールからの約束を確認して、これを修正するには:このコードで

exports.test = functions.database.ref('/zzz/{uid}').onWrite(event => { 
    console.log('zzz', event.data.val()); 

    return Promise.all([ 
     admin.database().ref('/zzz/1').once('value'), 
     admin.database().ref('/zzz/2').once('value') 
    ]).then(function(snaps) { 
     console.log('loaded', snaps[0].val()); 
     var updKeys = { 
      ["/xxx/" +event.params.uid +"/zoo"]: 'giraffe', 
     } 

     return admin.database().ref().update(updKeys, function(error) { 
      console.log("Updating data finished. ", error || "Success."); 
     }) 
    }); 

}); 

update()によって返された約束はそれを与えGCFに戻される1であり、必要な限り正確に機能を実行させるための情報。

+0

ああ!戻り値を逃した。ありがとう! :) また、どのタグがfirebase-functionsになっているのか不思議でした。 – jazzgil

+0

ええ、名前が混乱しています。申し訳ありません。また私の説明をここに見てください:http://stackoverflow.com/questions/42854865/what-is-the-difference-between-cloud-function-and-firebase-functions/42859932#42859932 –

+0

私は 'event.dataを使用していました。 ( '/ x') 'ここで' admin.database()。ref( '/ x') 'を使用することは可能ですか? – JCarlos

関連する問題