Мой firebase выглядит следующим образом:Странное поведение firebase сделки
Это тестовый код (кофе сценарий):
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
для получения дочернего элемента.
Это не нормально, я думаю, потому что 'однажды, 'child_added'' вернули правильные данные, поэтому я считаю, что он был синхронизирован с локальной копией? Почему тогда транзакция работает с нулевым значением? В любом случае, это глупо - представьте, что единственное, что я хочу сделать в своем приложении, - это запустить транзакцию - это означает, что мое приложение всегда будет терпеть неудачу, потому что данные не будут синхронизированы, а транзакция увидит «null». Я считаю, что если данные не синхронизируются, транзакция должна проверять его на сервере ... – user606521
Если вы используете 'once', клиент не будет кэшировать какие-либо данные, потому что вы указали, что вас интересует только его поиск * один раз *, но не держать его * обновлено *. Если вы используете 'on' вместо этого, клиент всегда будет кэшировать данные и обновлять этот кеш. –
Но я хочу проверять данные только один раз, а затем запускать транзакцию. Я попытался повторно запустить транзакцию после первого отказа, но снова данные, переданные функции обновления, являются «null». – user606521