2017-08-17 12 views
1

私はIonic 3、Firebase、FirebaseAuthを使用しています。現在認証されているユーザーを使用して、このユーザーのオブジェクトの一覧を取得しようとしています。以下は私の試みであり、私はそれがデータの各新しい作品でonNextを更新する必要がありますように、これは思えるように私はここで何かが欠けてるエラーrxjsで結果リストを返すには

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

を取得しています。

私の試み:

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勧告どおり

策:この条件が真であるとき、あなたは何を返していない第二flatMap()オペレータで

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

contactList && contactList.length > 0 

return文がforEachコールバックの内側にあります。

私はあなたのアプリケーションのロジックだか分からないけどflatMapへのコールバックは、常に観察可能(またはここに記載されて何か:http://reactivex.io/rxjs/class/es6/MiscJSDoc.js~ObservableInputDoc.html)を返す必要がある

+0

まあ、私は「(1)を取る」と思っ返します観察可能:輸出宣言機能はとなります(これは:Observable 、count:number):Observable ; – AnxGotta

+0

@AnxGotta Observableを返しますが、それは問題ではありません。私は第2の 'flatMap'について話しています – martin

+0

私は理解しません。返されたリストに項目がないか、またはnullの場合、Observable.throw( "")から 'ErrorObservable'を返します。リストに項目がある場合は、各項目についてObservableを返します。 – AnxGotta

関連する問題