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