firebase - 可观察到的困惑

标签 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

Error: Uncaught (in promise): Error: permission_denied at /chat: Client doesn't have permission to access the desired data. Error: permission_denied at /chat: Client doesn't have permission to access the desired data.

问题

有没有办法在不附加到Observable的情况下检索数据?这样我就可以随意删除关联用户了?或者有更好的方法来处理这个问题吗?

谢谢

最佳答案

听起来您想在第一个发出的列表之后取消订阅 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;
    });
}

关于firebase - 可观察到的困惑,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42851369/

相关文章:

ios - 此类与键 XXX 的键值编码不兼容 - 类是否正确连接?

javascript - 创建一个返回 Promise 并处理回调的函数

Swift - 从 Firebase 检索自动分配的 ID

ionic2 - 如何收听模态关闭事件?

ionic2 - Ionic CLI 未卸载

java - 从 Firebase 接收对象不起作用

java - Android firebase 实时写入新用户

android-studio - 无效的可执行目录 : . ./emulator

javascript - 在我的 Firebase 应用程序中写入和读取数据的推荐方法是什么?

ios - 如何在单个 iOS 项目/应用程序中为发布和 Debug模式(测试和生产环境)制作不同的 Firebase 数据库?