可观察到的混乱

时间:2017-03-17 07:13:15

标签: firebase firebase-realtime-database ionic2 firebase-authentication angularfire2

我将Ionic2AngularFire2一起使用。

我也在使用rxjs Observable。我有以下代码:

findChatsForUid(uid: string): Observable<any[]> {
    return this.af.database.list('/chat/', {
        query: {
            orderByChild: 'negativtimestamp'
        }
    }).map(items => {
        const filtered = items.filter(
            item => (item.memberId1 === uid || item.memberId2 === uid)
        );
        return filtered;
    });
}

deleteChatsAndMessagesForUid(uid: string): Promise<any> {
    return new Promise<any>((resolve) => {
        let promiseArray: Promise<any>[] = [];
        this.findChatsForUid(uid).map(items => {
            return items;
        }).forEach((chatItems) => {
            for (let i: number = 0; i < chatItems.length; i++) {
                promiseArray.push(this.deleteChat(chatItems[i], true));
            }
            Promise.all(promiseArray).then(() => {
                resolve(true);
            });
        });
    });
}

在第二个函数中,您可以看到我从第一个函数中检索Observable,并使用forEach函数循环遍历每个项目。

我的问题是,因为这是Observable,所以总是有一个对象的句柄。所以当我做以下事情时:

deleteChatsAndMessagesForUid(uid).then(() => {
    user.delete().then(() => {
        ...
    }
}

导致以下错误,因为已删除的用户仍在尝试观察Observable

  

错误:未捕获(在承诺中):错误:在/ chat处的permission_denied:   客户端无权访问所需数据。错误:   permission_denied at / chat:客户端无权访问   想要的数据。

问题

有没有办法检索数据,而无法附加到Observable?这样我可以自由删除关联用户?或者有更好的方法来解决这个问题吗?

由于

1 个答案:

答案 0 :(得分:2)

听起来你想在第一个发布列表之后从list observable取消取消。

您可以使用first运算符在第一个发出的列表后完成list observable。这将导致自动取消订阅,并且将从内部Firebase参考中删除侦听器。

import 'rxjs/add/operator/first';

findChatsForUid(uid: string): Observable<any[]> {
  return this.af.database
    .list('/chat/', {
      query: {
        orderByChild: 'negativtimestamp'
      }
    })
    .first()
    .map(items => {
      const filtered = items.filter(
        item => (item.memberId1 === uid || item.memberId2 === uid)
      );
      return filtered;
    });
}