2016-11-03 4 views
4

Я пытаюсь получить .then() для работы с .on(), но он работает только с .once().Firebase. Then with .on ('value')

я playersRef.on(...).then is not a function, при попытке его on()

Так что у меня сейчас это:

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)) 
     }) 
    }) 

Но мне не нравится тот факт, что он запрашивает реф дважды.

Как я могу получить ответ each в этом примере? Что было бы более правильным способом? Потому что я не думаю, что это было так, как планировали разработчики Firebase.

И какова аргументация, что он не реализован для .on()? Потому что playersSnapshot.forEach(...).then также не является функцией ... Как мне выполнить что-то только один раз при запуске .on('value') триггеров?

ответ

6

firebaser здесь

Я не весь некоторые части вашего вопроса, так будет отвечать только на те части, которые я могу.

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

Мы внедрили поддержку Promise в клиентах Firebase JavaScript. Определение обещания состоит в том, что он разрешает (или терпит неудачу) только один раз. Поскольку методы Firebase on() могут получать обновленные данные несколько раз, это не соответствует определению обещания.

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

Если вы хотите только один раз ответить на случай, вы должны использовать метод 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

Когда я пытаюсь '. Then' после' forEach', я получаю сообщение об ошибке: 'layersSnapshot.forEach (...), тогда это не функция' – BlockChange

+0

Да, это потому, что вы обрабатываете' then() 'дважды: один раз в строке 4 фрагмента, а затем снова в строке 12. Обещания связаны друг с другом, но только если вы вернете другое обещание от первого обработчика 'then()'. –