如何在 Angular2 中使用 AngularFire2 或 Firebase 进行多位置 "remove"

How to do a multi-location "remove" with AngularFire2 or Firebase in Angular2

我想 运行 一个组合操作,在一次操作中删除 Firebase 上的 2 个节点。如果我有节点位置,我知道有 remove() 来删除节点。但是什么是remove()操作return?承诺还是可观察?我如何知道删除操作成功,以便我可以 运行 其他删除操作或告诉我的组件删除操作成功(或有错误)?

示例提供(需要 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。因此,我不想 return 一个布尔值,而是 return 一个可观察值。我希望这是多位置删除。我该如何重构这段代码?太感谢了!

感谢 Frank,我想我找到了解决方案并在这里分享解决方案:

想法是对 "null" 的两个位置都使用 update(),它将在 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 return 为真时执行重定向或其他选项。反应式编程 VS Promise 的力量 :)