2017-08-17 23 views
1

我正在使用Ionic 3,Firebase和FirebaseAuth。我試圖使用當前通過身份驗證的用戶來檢索此用戶的對象列表。下面是我的嘗試,我得到一個錯誤如何使用rxjs返回結果列表

getContacts Error: TypeError: You provided 'undefined' where a stream was expected. You can provide an Observable, Promise, Array, or Iterable.

我在這裏的東西,因爲這似乎應該隨着每一個新的數據塊的更新onNext

我嘗試:

getContacts() { 
    this.contactList.length = 0; 
    this.data.getAuthenticatedUserContactList().subscribe(
     (contact => { 
     this.contactList.push(contact); 
     }), 
     (error => console.error(`getContacts Error: ${error}`)) 
    ); 
    } 

getAuthenticatedUserContactList() { 
    return this.afAuth.getAuthUser() 
     .flatMap(user => this.database.list(`contact-lists/${user.uid}`).take(1)) 
     .flatMap((contactList) => { 
     if (contactList && contactList.length > 0) {     
      contactList.forEach(element => { 
      console.log(`ForEach: ${element.userId}`); // THIS LOGS THE IDS AS EXPECTED 
      return this.database.object(`/profiles/${uid}`, { preserveSnapshot: true }).take(1); 
      }); 
     } else { 
      return Observable.throw(new Error("No bros here")); 
     } 
     }); 
    } 

任何幫助將不勝感激。

解決方案爲每forkJoin推薦:

getContacts() { 
    this.contactList.length = 0; 
    this.data.getAuthenticatedUserContactList().subscribe(
     (contact => { 
     contact.map(userContact => { 
      this.contactList.push(<UserProfile>(userContact)); 
     }); 
     }), 
     (error => console.error(`getContacts Error: ${error}`)) 
    ); 
    } 

    getAuthenticatedUserContactList() { 
    return this.afAuth.getAuthUser() 
     .mergeMap(user => this.database.list(`contact-lists/${user.uid}`).take(1)) 
     .mergeMap((contactList) => { 
     return Observable.forkJoin(contactList.map(element => this.getProfileWithUid(element.userId).map(userProfile => userProfile.val()))) 
     }); 
    } 

    getProfileWithUid(uid: string) { 
    this.profileObject = this.database.object(`/profiles/${uid}`, { preserveSnapshot: true }); 
    return this.profileObject.take(1); 
    } 

回答

1

在第二flatMap()操作時,這種情況是真實的你不返回任何東西:

contactList && contactList.length > 0 

return語句裏面forEach回調。

我不知道什麼是您的應用程序的邏輯,但回調flatMap總是需要返回可觀察到的(或東西在這裏列出:http://reactivex.io/rxjs/class/es6/MiscJSDoc.js~ObservableInputDoc.html)做

+0

嗯,我還以爲「採取(1)」返回可觀察:出口申報函數取(本文爲:Observable ,計數:數字):Observable ; – AnxGotta

+0

@AnxGotta它確實返回一個Observable,但這不是問題。我在說第二個'flatMap' – martin

+0

我不明白。如果返回的列表沒有項目或者爲空,我會從'Observable.throw(「」)'返回'ErrorObservable'。如果列表中有項目,我會爲每個項目返回一個Observable。 – AnxGotta