0

anglefire2で操作を実行しています。次のコードを使用して現在ログインしているユーザーのユーザーIDを取得します。IDを必要とする別のObservableを呼び出す前にユーザーIDを取得できません - Angularfire2

angularfire.auth.subscribe(auth => { 
     this.userId = auth.uid; 
     console.log(this.userId); 
    } 

これは正常に動作し、ローカル変数userIdにuidを割り当てます。

私が午前問題は、私は次のコードを実行したいときです:

let shipObservable = angularfire.database.list('/ships/' + this.userId); 

    shipObservable.subscribe(
     value => { 
      this.otherObservable = angularfire.database.list('/other/' + value[0].otherId); 
      this.otherObservable.subscribe(value => { 
       this.address = value[0].$value; 
       this.number = value[1].$value; 
       this.email = value[2].$value; 
       this.name = value[3].$value; 
       }); 
    }).catch((err) => console.log(err)); 

問題は、私が最初に観察から戻ってUIDを取得する前に、コードの第二の部分が実行されることです。私はこれらが非同期操作であり、いつでも戻ってくる可能性があることを認識しています。しかし、私が知りたいのは、の後に2番目のオブザーバブルがを実行するようにする方法があるかどうかを知りたいのですが、そのユーザーIDはauthによって返されたuidに割り当てられています。

+0

AngularFireは今の約束を返します。 –

+0

@CorySilvaどの部分が約束を返すのですか?これは最近の更新ですか? –

+0

私はsubscribeメソッドを探していて、それを見つけることができませんでした...私はそれを覚えていません。どのバージョンを使用していますか?私が参照した約束はここに記載されています(https://www.firebase.com/docs/web/libraries/angular/api.html#angularfire-firebaseobject-value) –

答えて

0

RXJSの一部であるswitchMap operatorを使用してこの問題を解決しました。以下のスニペットでは、 'afAuth'はfirebase authオブジェクトへの参照であり、 'af'はfirebaseデータベースオブジェクトへの参照であると仮定します。

authState$ = afAuth.authState; 
shipObservable$ = authState$.switchMap((auth) => { 
    return af.list('ships/' + auth.uid); 
}); 

switchMapを使用するには、オペレータインポートする必要があります。

import 'rxjs/add/operator/switchMap'; 
関連する問題