2014-11-27 6 views
2

Мой firebase выглядит следующим образом:Странное поведение firebase сделки

enter image description here

Это тестовый код (кофе сценарий):

Firebase = require 'firebase' 

ref = new Firebase 'https://my_firebase.firebaseio.com/items' 

ref.once 'child_added', (snapshot) -> 
    childRef = snapshot.ref() 
    console.log "child_added", childRef.toString(), snapshot.val() 
    childRef.transaction(
    (data) -> 
     console.log 'transaction on data', data 
     return if !data or data.my_key isnt 'my_val' 
     data.my_key = 'new_val' 
     return data 
    , 
    (err, commited, snapshot) -> 
     if err 
     console.error 'error', err 
     return 
     console.log 'commited? '+commited 
     console.log 'server data', snapshot.val() 
    , 
    false 
) 

И выход:

child_added https://my_firebase.firebaseio.com/items/item1 { my_key: 'my_val' } 
transaction on data null 
commited? false 
server data null 

Same происходит, когда третий параметр transaction(...) является истинным. Чтобы этот код работал, я должен изменить ref.once 'child_added', (snapshot) -> на ref.on 'child_added', (snapshot) -> (once до on). После этого выход изменение:

child_added https://my_firebase.firebaseio.com/items/item1 { my_key: 'my_val' } 
transaction on data { my_key: 'my_val' } 
commited? true 
server data { my_key: 'new_val' } 

Кажется, что по какой-то причине, когда я использую once данные не синхронизированы правильно и локальный снимок не обновляется и транзакции «думает», что нет никаких данных под исх. Это ошибка, или я делаю что-то неправильно? Я знаю о транзакциях, которые updateFunction может быть вызван более одного раза, и о третьем параметре (я пробовал для него истинные и ложные варианты), но все же я не могу понять, почему транзакция не работает при использовании once для получения дочернего элемента.

ответ

4

Сделка должна в конечном итоге преуспеть и выполнить правильное состояние данных, но вначале будет выполняться в состоянии «uncached», то есть она будет работать против локальной копии данных клиента (вероятно, будет null) попытайтесь зафиксировать изменения на сервере (что не удастся), а затем повторите попытку транзакции.

Это нормальный, и ожидается. Если, однако, транзакция не преуспеет, я бы рекомендовал обратиться к людям поддержки на [email protected], чтобы продолжить устранение неполадок.

+1

Это не нормально, я думаю, потому что 'однажды, 'child_added'' вернули правильные данные, поэтому я считаю, что он был синхронизирован с локальной копией? Почему тогда транзакция работает с нулевым значением? В любом случае, это глупо - представьте, что единственное, что я хочу сделать в своем приложении, - это запустить транзакцию - это означает, что мое приложение всегда будет терпеть неудачу, потому что данные не будут синхронизированы, а транзакция увидит «null». Я считаю, что если данные не синхронизируются, транзакция должна проверять его на сервере ... – user606521

+1

Если вы используете 'once', клиент не будет кэшировать какие-либо данные, потому что вы указали, что вас интересует только его поиск * один раз *, но не держать его * обновлено *. Если вы используете 'on' вместо этого, клиент всегда будет кэшировать данные и обновлять этот кеш. –

+1

Но я хочу проверять данные только один раз, а затем запускать транзакцию. Я попытался повторно запустить транзакцию после первого отказа, но снова данные, переданные функции обновления, являются «null». – user606521

Смежные вопросы