2017-12-13 18 views
3

私が苦労している問題を解決するのを手伝ってください。forkJoinがAngularFire2のvalueChangesで動作しない

私は私が何をしようとしているFirebaseオブジェクトキー

const keys = ['-Kx9pqoMWlJLbKLQcAkP', '-Kx9pqoOYlDHTJ64Was5'] 

の配列を持っているがforkJoinを使って一つのストリーム内のすべてのものをFirebaseのオブジェクトを取得することです。ここで私が持っているものです。

const obj1 = this.fbService.getObj(keys[0]); 
const obj2 = this.fbService.getObj(keys[1]); 

forkJoin([obj1, obj2]) 
    .subscribe(res => { 
     console.log(res); // <-- this never happens 
    }; 

fbService方法は次のとおりです。

getObj(key): Observable<MyObj> { 
    return this.fb.object(`/path/to/obj/${key}`).valueChanges(); 
} 

私はこのgetObj方法は、多分理由valueChangesの、forkJoinとうまく動作しません、私はそれを正しく使用していますと仮定?しかし

  • getObjは次のように、単一Firebaseのオブジェクトを取得するため正常に動作します:

    this.fbService.getObj(keys[0]) 
        .subsribe(res => console.log(res))// <-- works 
    
  • forkJoin

    const r1 = this.http.get('https://swapi.co/api/people/1'); 
    forkJoin([r1]) 
        .subscribe(res => { 
         console.log(res); // <-- works 
        }; 
    
のように、シンプルなHTTPリクエストと正常に動作します

だから私は何を間違えているのですか? 私の目標は、キーの配列からオブジェクトの配列を取得することです:

['-Kx9pqoMWlJLbKLQcAkP', '-Kx9pqoOYlDHTJ64Was5'] => [{prop:'val'},{prop:'val2'}] 
+0

あなたは 'this.fbService.getObj(keys [1])'も使えますか? 'forkJoin'内の複数のオブザーバブルのいずれかが失敗した場合、ストリーム全体が失敗するためです。 – CozyAzure

+0

はい、私はそれを試みました。 'this.fbService.getObj(keys [1])'は動作しますが、 'forkJoin'の中では、それだけでも動作しません。 – Matiishyn

答えて

3

forkJoinオペレータは、少なくともつの項目を発するように、完全なをするすべてのソースの観測が必要です。

私はファイヤーベースについてよく分かりませんが、valueChangesは決して完結しないので、疑問があります。そのため、forkJoinは決して何も放出しません。これを使用する方法の1つは、take(1)を使用して常にチェーンを完了させることです。

forkJoin(obj1.take(1), obj2.take(1)).subscribe(res => console.log(res); 

たぶん、あなたのケースでは、ちょうど同じ数の項目を放出するすべてのソースの観測を必要とzip()演算子を使う方が良いでしょう。ただし、Observableのソースが完了するまでは完了しないため、退会してください。

+1

私はドキュメントをチェックしました。はい、決して完了しません。私はOPの代わりに '.combineLatest()' – CozyAzure

+0

を使用しなければならないと思います。しかし、私はそれを単独で使用するとなぜこの「valueChanges」が機能しますか? 'this.fb.object(' ... ').valueChanges()。subscribe(WORKS)' – Matiishyn

+2

最初のパラメータはすべての項目に対して呼び出される 'next'ハンドラです。 Observableが完了したかどうかを確認したい場合は、例えば、この状況では '.subscribe(undefined、undefined、()=> console.log( 'complete'))' – martin

関連する問題