2017-08-03 7 views
1

にrxjs forkjoinコールを変換する助けiがforkJoinを使用して作業していることを呼び出す必要があります。私はngrx Store <から来るアイテムの配列を持っており、各アイテムのhttp呼び出しを行う必要があります)。は私がサービスのセットをリファクタリングしたい(ngrx @Effect内側)非同期呼び出し

forkjoin/wの問題は、それが基本的にブロック操作であるということですので、私はそれを返す前に、すべてのコールが終了するのを待つ必要がある - そしてそれは長いリストである可能性があります。

私は非同期であることを通話にしたい - 各項目のループになるよう、サービスを呼び出し、UIがアイテムを更新しますので、結果を返します。ここで

が私の作業コードで(物事を少し複雑にしているのは、これはngrx @Effect内にラップされた):

@Effect() 
    loadItemValues$: Observable<Action> = this.actions$ 
     .ofType(setActions.LOAD_ITEMS_DATA) 
     .map(toPayload) 
     .switchMap(key => { 
      return this.store.select(fromRoot.getItems) 
       .flatMap(items => { 
        let observables = new Array(); 
        for (let i of items) { 
         observables.push(this.myService.getItemInfo(i, key)); 
        } 
        return Observable.forkJoin(observables) 
        .map((res: Grades[]) => { 
         return new setActions.LoadValuesSuccessAction(res); 
        }) 
       }) 
     }) 

私は新しい観測を作成して、再びflatmap使用する必要があることを想定しているが、各アイテムに対してサービスが確実に呼び出されるように、チェーンをどのようにバックアップするかをどのように/どのようにして把握し、その後に結果とともにLoadValuesSuccessAction Reducerを呼び出します。

ご協力いただければ幸いです。

+0

だから、 'LoadValuesSuccessAction'の各、1つずつ放出された値をしたい - その中に単一の値を持つ配列を含む各アクションで? – cartant

+0

@cartant正しいです。成功アクションは状態を(減速機経由で)設定します – user58210

答えて

2

の変化は軽微です。ただmergeを使用し、

return Observable.merge(...observables) 
.map((res: Grades) => { 
    return new setActions.LoadValuesSuccessAction([res]); 
}) 

代わりのforkJoinを使用して:これで

return Observable.forkJoin(observables) 
.map((res: Grades[]) => { 
    return new setActions.LoadValuesSuccessAction(res); 
}) 

:あなたがする必要がある必要があるすべては、これを置き換えるです。それは単一のGrades[]の代わりに個々のGradesが(利用可能になるとすぐに)放出されるのを見るでしょう。受け取ったresを配列にラップする必要があります。アクション作成者がGrades[]引数を受け入れる可能性が高いからです。

+0

ありがとうございました。クイック質問、省略記号は何をしていますか? – user58210

+0

[配列の広がりの構文](https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Operators/Spread_operator#Spread_in_array_literals)です。多くのRxJSメソッドは観測可能な複数のパラメータを受け入れ、複数回渡されると一貫して動作します。しかし、配列を渡すと、振る舞いが違うものもあります(例えば、 'forkJoin'は、複数の観測可能なパラメータと同じ配列パラメータを扱いますが、' concat'はそうではありません - 配列を[ObservableInput'](http:// reactivex .io/rxjs/class/es6/MiscJSDoc.js〜ObservableInputDoc.html))ので、一貫性のために普及構文を使用することをお勧めします。 – cartant

関連する問題