2014-08-27 2 views
0

Следующий код создает бесконечный цикл повторения child_added, хотя я никогда не добавляю ребенка. Узлы удаляются. Я просто петлю навсегда. Как я могу это исправить?Почему я делаю событие child_added при удалении?

//notifications branch is pre-populated when I get here: 
notifications.startAt(null).on('child_added', processNotification, logError); 

function processNotification(notification) 
{ 
    removeNotification(notification); 
} 

function removeNotification(notification) 
{ 
    var child = notifications.child(notification.name()); 
    console.log("REMOVING", child.toString()); 
    child.remove();  
} 

Что необходимо войти в одни и те же четыре узла (А, В, С, D) удаляется:

REMOVING https://my.firebaseio.com/experimental/-JVMi0_4poXfOWUt5g49 - A 
REMOVING https://my.firebaseio.com/experimental/-JVMi1Y_bFwZAkffRel4 - B 
REMOVING https://my.firebaseio.com/experimental/-JVMi2lyhKj8z27ik71x - C 
REMOVING https://my.firebaseio.com/experimental/-JVMhzazdgHYAstqxu8L - D 
REMOVING https://my.firebaseio.com/experimental/-JVMi0_4poXfOWUt5g49 - A 
REMOVING https://my.firebaseio.com/experimental/-JVMi1Y_bFwZAkffRel4 - B 
REMOVING https://my.firebaseio.com/experimental/-JVMi2lyhKj8z27ik71x - C 
REMOVING https://mu.firebaseio.com/experimental/-JVMhzazdgHYAstqxu8L - D 
... 
+0

Это также происходит, если вы заменяете 'var child = notifications.child (notification.name());' с 'var child = notification.ref();' –

+0

Ну, проблема в том, что вызов не является ссылкой , Устранение происходит. Я не вижу, как это имеет значение, если оно работает. Что вы думаете? – user9170

+0

Мое рассуждение состоит в том, что он выглядит запутанным, и у меня не было времени воспроизвести проблему. Кроме того, вы также можете посмотреть https://github.com/firebase/firebase-work-queue, что делает что-то похожее на то, что вы пытаетесь. Они используют обработчик 'transaction', который возвращает' null', чтобы удалить обработанные элементы. –

ответ

1

В конце концов, я просто упал запрос и пошел с нормальной обработкой, сбросив «startAt (NULL)»:

notifications.on('child_added', processNotification, logError); 

Это не очевидно, что поведение будет отличаться от документов, но startAt (null) не приводит к такому же поведению (хотя в этом случае он должен). Я бы хотел, чтобы это было задокументировано.

1

я смог воспроизвести проблему. Я думаю, что это вызвано тем, что Query пытается сохранить элементы в своем «окне», когда вы его удаляете.

Вы можете обойти эту проблему с помощью once('value' вместо on('child_added', например:

notifications.startAt(null).once('value', processNotifications); 

function processNotifications(notifications) 
{ 
    notifications.forEach(function(notification) { 
     notification.ref().remove(); 
    }); 
} 

Поскольку value срабатывает только once, он не будет вмешиваться в remove операции.

+0

Я также смог исправить это, просто отбросив запрос все вместе: – user9170

+0

Это мой предпочтительный способ работы. Запросы кажутся мощными, но они иногда противоречат интуиции. Можете ли вы отправить ответ своим решением и принять это? Таким образом, другие знают, как вы это решили. –

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