【问题标题】:Observable Confusion可观察到的混乱
【发布时间】:2017-08-08 15:33:10
【问题描述】:

我正在使用 Ionic2AngularFire2

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

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

错误:未捕获(承诺):错误:permission_denied at /chat: 客户无权访问所需数据。错误: permission_denied at /chat:客户端没有访问权限 所需的数据。

问题

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

谢谢

【问题讨论】:

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


    【解决方案1】:

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

    【讨论】:

    • 谢谢! first() 函数做到了。
    猜你喜欢
    • 1970-01-01
    • 2017-04-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-11
    相关资源
    最近更新 更多