2

我使用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

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?这样我可以自由删除关联的用户?还是有更好的方法来处理这个问题?

感谢

回答

2

这听起来像你希望从第一发射名单后list可观察到unsubsribe。

您可以使用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; 
    }); 
} 
+0

谢谢!第一个()函数做到了。 – Richard