При вызове off()
будет останавливать клиент Firebase от стрельбы child_added
событий для новых данных, который приходит. Это не мешает ему от стрельбы child_added
события для данных клиент уже получил.
Вы можете получить интересное поведение таким образом. Например, ваш фрагмент кода:
var ref = new Firebase('https://stackoverflow.firebaseio.com/31069762');
ref.remove();
for (var n = 0; n < 1024; ++n) {
ref.push(n)
}
ref.on('child_added', function(snapshot) {
console.log(snapshot.val());
if (snapshot.val() > 10) {
console.log('off') // Printed multiple times.
ref.off();
}
});
Напечатает:
1
2
.
.
.
11
"off"
12
"off"
.
.
.
1024
"off"
Данные для исх будет скачать как «одного исходного пакета» при регистрации слушателя, а оттуда на всех child_added
событий увольняют ,
Теперь давайте изменим код вокруг:
var ref = new Firebase('https://stackoverflow.firebaseio.com/31069762');
ref.remove();
ref.on('child_added', function(snapshot) {
console.log(snapshot.val());
if (snapshot.val() > 10) {
console.log('off') // Printed multiple times.
ref.off();
}
});
for (var n = 0; n < 1024; ++n) {
ref.push(n)
}
Так что в этом случае мы первый зарегистрировать слушателя и только затем начать толкая значения. Выход:
1
2
.
.
.
11
"off"
Так что с этим заказом он останавливается сразу. Поскольку мы начали прослушивать child_added
, прежде чем появились какие-либо данные, начальная полезная нагрузка была пустой, и мы получим каждый потомк в качестве отдельного обновления.
Обратите внимание, что все это зависит от внутренних компонентов клиента Firebase, и я не проверял, как он там работает. Таким образом, «один начальный пакет», о котором я упоминал выше, является именно тем, как его визуализирует I.
Если вы действительно не хотите обрабатывать данные после 10
, есть два решения, которые я могу придумать.
тот, который вы уже делаете: сохранить местный «Я сделал» флаг
использовать Query
, чтобы ограничить данные, которые Firebase загрузки, вместо фильтрации на стороне клиента:
ref.orderByValue().endAt(10).on('child_added'...
Обратите внимание, что orderByValue
был представлен в версии 2.2.7 SDK Firebase. Мне потребовалось некоторое время, чтобы понять, почему я не мог использовать его в JSBin. : -/
'ss' является' событием', так что такое 'ss.val(). End' должен быть? – Barmar
@Barmar: Это просто ценность. Как это относится к проблеме? – ronag
'Event' не имеет метода' val() ', поэтому он должен получить ошибку при попытке вызвать' ss.val() '. Это предотвратит выполнение 'segmentRef.off()'. – Barmar