2015-06-26 6 views
1

У меня есть ситуация, когда даже если я звоню off по ссылке, она продолжает звонить обратные вызовы?callback называется даже после выключения?

var ref = new Firebase('https://stackoverflow.firebaseio.com/31069762'); 

for (var n = 0; n < 1024; ++n) { 
    ref.push(n) 
} 

ref.on('child_added', function(snapshot) { 
    if (snapshot.val() > 10) { 
    console.log('off') // Printed multiple times. 
    ref.off(); 
    } 
}); 
+0

'ss' является' событием', так что такое 'ss.val(). End' должен быть? – Barmar

+0

@Barmar: Это просто ценность. Как это относится к проблеме? – ronag

+0

'Event' не имеет метода' val() ', поэтому он должен получить ошибку при попытке вызвать' ss.val() '. Это предотвратит выполнение 'segmentRef.off()'. – Barmar

ответ

2

При вызове 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, есть два решения, которые я могу придумать.

  1. тот, который вы уже делаете: сохранить местный «Я сделал» флаг

  2. использовать Query, чтобы ограничить данные, которые Firebase загрузки, вместо фильтрации на стороне клиента:

    ref.orderByValue().endAt(10).on('child_added'... 
    

    Обратите внимание, что orderByValue был представлен в версии 2.2.7 SDK Firebase. Мне потребовалось некоторое время, чтобы понять, почему я не мог использовать его в JSBin. : -/

+0

Хорошо. Это, вероятно, должно быть где-то зарегистрировано. Тем более, что все другие события apis гарантируют, что обратный вызов не вызывается снова после «off/removeEventListener». – ronag

+0

Согласовано. Мы будем отслеживать, как часто люди сталкиваются с этим. Пока вы первый, что мне известно. Я определенно никогда не замечал этого поведения до сегодняшнего дня, вероятно, потому, что я довольно сосредоточен на использовании запросов, чтобы минимизировать данные, которые доходят до моих клиентов. –

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