2016-11-03 9 views
4

私は.then().on()と動作させようとしていますが、.once()としか動作しません。Firebase .then with( 'value')

let nodesRef = Firebase.database().ref('players') 
    let answers = {} 
    playersRef.on('value', (playersSnapshot) => { 
     playersRef.once('value').then((playersSnapshot) => { 
     playersSnapshot.forEach((playerSnapshot) => { 
      let playerKey = playerSnapshot.key 
      let answersRef = playerSnapshot.child('answers') 
      if (answersRef .exists()){ 
      answers[playerKey ] = answersRef .val() 
      } 
     }) 
     }).then(() => { 
     console.info(answers); 
     dispatch(setPlayerAnswers(answers)) 
     }) 
    }) 

しかし、私はそれが二回REFを照会しているという事実が好きではない:

on()

でそれをしようとしたとき、私は、それでは私が今持っていることはこれです、playersRef.on(...).then is not a functionを取得します。

この例ではeachさんの回答はどうなりますか?何がもっと正しいでしょう方法? Firebaseの開発者がこれを意図した方法ではないと思うからです。

.on()に実装されていない理由は何ですか? playersSnapshot.forEach(...).thenも関数ではないので...何かを実行するには.on('value')がトリガするたびにを1回だけ実行しますか?

答えて

6

ここfirebaser

私はあなたの質問の一部の特定の全体ないんだけど、これだけで私ができる部品にお答えします。

what is the reasoning that [ then() ] is not implemented for .on() ?

私たちはFirebase JavaScriptクライアントで約束をサポートしました。約束の定義は、それが一度だけ解決(または失敗)することです。 Firebase on()メソッドは更新されたデータを複数回受け取ることができるため、約束の定義に適合しません。

How do I execute something only once whenever the .on('value') triggers?

イベントに1回だけ応答したい場合は、once()メソッドを使用する必要があります。

なぜforEach()で問題が発生しているのかわかりません。次のように動作するはずです:

playersRef.on('value', (playersSnapshot) => { 
    playersSnapshot.forEach((playerSnapshot) => { 
     let playerKey = playerSnapshot.key 
     let answersRef = playerSnapshot.child('answers') 
     if (answersRef .exists()){ 
     answers[playerKey ] = answersRef .val() 
     } 
    }) 
}) 

この作業に問題がある場合は、jsbinにその問題を再現できますか?

+0

'forEach'の後に' .then'を実行すると、 'layersSnapshot.forEach(...)、それは関数ではありません。 ' – BlockChange

+0

' then() 'を2回扱うからです。スニペットの4行目に、そして12行目に再び表示されます。プロミスは連鎖可能ですが、最初の 'then()'ハンドラから別の約束を返す場合に限ります。 –