2014-10-23 3 views
28

Я использую Firebase для веб-приложения. Он написан на простом Javascript, не используя внешние библиотеки.Как удалить/удалить узлы на Firebase

Я могу «нажимать» и извлекать данные с помощью .on («child_added») ', но' .remove() 'не работает так, как он говорит. Согласно API,

«Firebase.remove() - Удалить данные на этом месте Firebase Любые данные в местах, детей также будут удалены Эффект удаления будет виден сразу...»

Однако удаление происходит не сразу; только когда весь скрипт запущен. Мне нужно удалить, а затем использовать очищенное дерево сразу после.

Пример кода:

ref = new Firebase("myfirebase.com") //works 
ref.push({key:val}) //works 

ref.on('child_added', function(snapshot){ 
//do stuff 
}); //works 

ref.remove() 
//does not remove until the entire script/page is done 

Существует аналогичный пост here, но я не использую библиотеки Ember, и даже так, что кажется, как обходной путь для того, что должно быть так же просто, как API объясняет, что это будет.

+1

Непонятно, что вы думаете, что здесь не так. Устранение() работает отлично. Здесь вы выполняете много асинхронных действий и, похоже, считаете их синхронными (подсказка: нет гарантии того, какой порядок эти события будут иметь место, если вы не используете обратные вызовы успеха для запуска следующего события) – Kato

ответ

56

Проблема заключается в том, что вы называете remove на корень вашего Firebase:

ref = new Firebase("myfirebase.com") 
ref.remove(); 

Это не будет работать, потому что вы не можете удалить весь Firebase через API.

Вы можете удалить любого ребенка под ним.

ref.child(key).remove(); 
+7

Вы можете позвонить remove() в корне экземпляра Firebase, если это позволяют правила безопасности. Я просто испытал, чтобы убедиться, что здесь нет ничего подозрительного; он отлично работает. – Kato

+0

Woops ... Служит мне для не тестирования. Я обновлю свой ответ, когда снова на лучшей клавиатуре. –

+0

Что он снимает в этом случае? Все дети (так что все данные ** в ** приложении)? Или он сам удаляет приложение, например, когда вы нажимаете «удалить» из панели мониторинга Firebase (https://www.firebase.com/account/)? –

4

Firebase.remove(), как вероятно, наиболее Firebase методов является асинхронным, таким образом, вы должны слушать события знать, когда что-то случилось:

parent = ref.parent() 
parent.on('child_removed', function (snapshot) { 
    // removed! 
}) 
ref.remove() 

Согласно Firebase документы он должен работать, даже если вы потеряете связь с сетью. Если вы хотите знать, когда изменение было фактически синхронизируется с серверами Firebase, вы можете передать функцию обратного вызова Firebase.remove метода:

ref.remove(function (error) { 
    if (!error) { 
     // removed! 
    } 
} 
6

Как уже отметили призыв к .remove() является асинхронным. Мы все должны знать, что ничего не происходит 'мгновенно', даже если он находится на скорости света.

Что вы подразумеваете под 'instantly': следующая строка кода должна быть выполнена после вызова .remove(). При асинхронных операциях следующая строка может быть, когда данные были удалены, это может быть не - это полностью не имеет шансов и времени, которое истекло.

.remove() принимает один параметр функции обратного вызова, чтобы помочь справиться с этой ситуацией, чтобы выполнить операции после того, как мы знаем , что операция была завершена (с или без ошибок). .push() принимает два параметра, значение и обратный вызов точно так же, как .remove().

Вот ваш пример кода с модификациями:

ref = new Firebase("myfirebase.com") 

ref.push({key:val}, function(error){ 
    //do stuff after push completed 
}); 

// deletes all data pushed so far 
ref.remove(function(error){ 
    //do stuff after removal 
}); 
+0

вы УВЕРЕНЫ, что вы «// делаете вещи» в обратном вызове «ошибка»? – Cerberus

+0

эй @Cerberus - tbh теперь им не уверен. Я прекратил использование fbase после покупки Google. plz отредактируйте ответ, если его неправильная или ссылка на новую документацию –

+1

сделано, но это больше похоже на «вашу коллекцию», чем «ваша-база», которая может быть всей базой в любом случае ... Cheers @DavidAnderton – Cerberus

1

Чтобы удалить запись.

var db = firebase.database();     
var ref = db.ref(); 
var survey=db.ref(path+'/'+path); //Eg path is company/employee     
survey.child(key).remove();   //Eg key is employee id 
Смежные вопросы