2017-05-24 8 views
0

個別の原因となるのはsubscribeですが、forkJoinはトリガーしません。RxJS - いつforkJoinトリガーですか?

subject.subscribeをトリガーするリクエストを送信しましたが、forkJoinで使用する配列に追加したときにforkJoin().subscribeが実行されません。戻ってくる結果は、オブジェクトです。

let responses$ = []; 
    _.map(items, (item) => { 
     let subject = new Subject(); 
     this.apiService.postRequest("/api/my-endpoint", data).subscribe(subject); 
     responses$.push(subject); 
     subject.subscribe((res) => { console.log("this triggers") }); 
    }); 

    Observable.forkJoin(responses$).subscribe((res) => { 
     console.log("this does not trigger"); 
    }); 

そして、ここpostRequestである - 私は、私は右のそれをやっているかわからない、私は約束のようなチェーンそれに望んでいました。

public postRequest(url: string, data: any) { 
    return this.getToken().flatMap((accessToken: Response) => { 
     return this.post(url, data, {'Authorization': 'Bearer ' + accessToken}); 
     }); 
} 

は、率直に言って私は約束と$q.allに似た何かをしたかったです。

答えて

1

forkJoinは、渡された各オブザーバブルからの最後の値を含む配列を出力します。すべてのオブザーバブルが完了すると配列を送出します。

それに渡される各観測値は、少なくとも1つの値を出す必要があり、完了する必要もあります。

参加しているオブザーバブルのサブスクリプションがトリガしないのは、オブザーバブルが完了していないためです。質問にはgetToken()の実装は含まれていませんが、それが完了しない限りforkJoinは値も出力もしません。

あなたはpostRequest実装でfirst()を使用して、完全に観測することを保証することができます:

public postRequest(url: string, data: any) { 
    return this.getToken() 
    .first() 
    .flatMap((accessToken: Response) => { 
     return this.post(url, data, {'Authorization': 'Bearer ' + accessToken}); 
    }); 
} 
+0

はありがとうございます。私はgetToken()を見て、新しいObservableを作成していましたが、 'onComplete()'をトリガーしませんでした。 – riyuyu

関連する問題