В Firebase для Android я использую следующую структуру данных для чата с ограниченным количеством слотов:
/rooms
/<roomid, generated by push()>
/users
one: null
two: null
three: null
Чтобы мои клиенты могли занять один из слотов (с one
по three
), я использую следующий код как указано здесь (версия JavaScript)< /а>:
var userid = "myuserid";
var ref = new Firebase("<my-firebase>.firebaseio.com/rooms/<roomid>/users");
ref.transaction(function(users) {
if (!users.one) {
// Claim slot 1
users.one = userid;
return users;
} else if (!users.two) {
// Claim slot 2
users.two = userid;
return users;
} else if (!users.three) {
// Claim slot 3
users.three = userid;
return users;
}
// Room is full, abort the transaction.
return;
}, function(err, committed, snapshot) {
if (committed && !err) {
// Joined room successfully.
} else {
// Could not join room because it was full.
}
});
После некоторого тестирования я обнаружил, что это не работает. Прав ли я со следующими двумя предположениями, объясняющими, почему это не работает?
- В
runTransaction(...)
(Android) илиtransaction(...)
(JavaScript) необходимо установить необязательный параметрfireLocalEvents
(Android) илиapplyLocally
(JavaScript) в значениеfalse
, поскольку в противном случае вы будете получать события от транзакции, даже если она не будет успешной. - Даже если для
fireLocalEvents
(Android) илиapplyLocally
(JavaScript) задано значениеfalse
, события дляonChildChanged(...)
по этой ссылке будут срабатывать до успешной транзакции вonComplete(...)
. Это намеренное поведение?
В этом особом случае это означает, что я буду уведомлен о том, что комната чата заполнена (в ChildEventListener.onChildChanged(...)
) прежде, чем я узнаю, что я сам получил последний слот (в Transaction.Handler.onComplete(...)
).
Предположим, что если зал полон...
- и у меня там слот, выполняется какой-то код и запускается что-то новое.
- и ни один из слотов мне не достался, я просто хочу скрыть комнату из списка (поскольку она уже недоступна).
Если я хочу это сделать, я должен переместить всю логику для этого в ChildEventListener.onChildChanged(...)
, потому что там я сначала получу событие, верно? В противном случае комната будет скрыта до того, как я узнаю, что именно я получил там последний слот.
Любые идеи?
fireLocalEvents
. - person caw   schedule 24.10.2014