我想运行组合操作,在一次操作中删除Firebase上的2个节点。我知道如果我有节点位置,有remove()删除节点。但是什么是remove()操作返回?承诺还是可观察的?我怎么知道删除操作成功,所以我可以运行其他删除操作或告诉我的组件删除操作是否成功(或有错误)?
示例提供(需要有关AngularFire的多位置删除帮助的帮助):
constructor(private db:AngularFireDatabase, @Inject(FirebaseRef) fb) {
this.sdkDb = fb.database().ref();
}
deleteTask(taskId: string, jobtypeId: string): boolen {
const taskObservable = this.db.object('tasks' + '/' + taskId);
const taskPerJobtypeObervable = this.db.object('tasksPreJobtype' + '/' + jobtypeId + '/' + taskId);
taskObservable.remove()
.then(_ => {
console.log('success');
taskPerJobtypeObervable.remove()
.then(_ => {
return ture
});
})
.catch(err => {console.log(err, 'You dont have access!'), return false});
}
如你所见,我需要将删除链接作为一个承诺,我真的想避免。我希望这是可观察的模式,因为我使用angularFire2。因此,我想返回一个可观察的,而不是返回一个布尔值。我希望这是多位置删除。我该如何重构这段代码?非常感谢!
答案 0 :(得分:3)
感谢Frank,我想我找到了解决方案并在此处分享解决方案:
我们的想法是将update()用于" null",并且它将在Firebase中删除它。
以下是重构代码:
deleteTask(taskId: string, jobtypeId: string): Observable<any> {
let dataToDelete = {};
dataToDelete['tasks/' + taskId] = null;
dataToDelete['tasksPreJobtype/' + jobtypeId + '/' + taskId] = null;
return this.firebaseUpdate(dataToDelete);
}
firebaseUpdate(dataToSave) {
const subject = new Subject();
this.sdkDb.update(dataToSave)
.then(
val => {
subject.next(val);
subject.complete();
},
err => {
subject.error(err);
subject.complete();
}
);
return subject.asObservable();
}
有了这个,我的组件可以很容易地订阅deleteTask并仅在deleteTask返回true时进行重定向或其他选项。反应式编程的力量VS承诺:)