我想运行一项组合操作,在一次操作中删除 Firebase 上的 2 个节点。我知道如果我有节点位置,可以使用remove()来删除节点。但是remove()操作的返回值是什么呢?是 promise 还是可观察到的?我如何知道删除操作已成功,以便我可以运行其他删除操作或告诉我的组件删除操作已成功(或有错误)?
提供示例(需要有关 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});
}
如您所见,我需要将删除链接为 promise ,我真的想避免这种情况。我希望这是可观察的模式,这也是我使用 angularFire2 的原因。因此,我不想返回 bool 值,而是想返回一个可观察的值。我希望这是多位置删除。我该如何重构这段代码?太感谢了!
最佳答案
感谢 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时执行重定向或其他选项。响应式(Reactive)编程的力量 VS Promise :)
关于angular - 如何在 Angular2 中使用 AngularFire2 或 Firebase 进行多位置 "remove",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41731202/