2017-12-21 28 views
0

私はダイアログを開いてダイアログ内のフォームコントロールのデータをプリロードするアクションを送出します。アクションは、元のアクションに渡された配列内の各idのデータをプリロードする新しいアクションの配列を戻すエフェクトによってピックアップされます。mergeMapは以前のHTTP呼び出しをキャンセルします

@Effect() 
preloadReferenceData$ = this.actions$ 
    .ofType(PRELOAD_REFDATA) 
    .pipe(
    map((action: PreloadRefData) => action.payload), 
    mergeMap(ids => { 
     const actions: Action[] = []; 
     ids.forEach((id) => actions.push(new LoadRefDataForId(id))); 
     return actions; 
    }) 
); 

通常、私はこれは私が同じタイプの複数のアクションを派遣しています初めてです、そしてそれは私が経験したのは初めてだが、効果から複数の新しいアクションを成功裏に派遣するmergeMap演算子を使用しますXHRの呼び出しがキャンセルされることがあります。私はmergeMapを使用したときにXHR呼び出しがキャンセルされた場合にswitchMapの使用を疑ったでしょう。

これら

actions

LoadRefDataForId {payload: "2441", type: "[Refdata] Load RefData"} 
LoadRefDataForId {payload: "7612", type: "[Refdata] Load RefData"} 
LoadRefDataForId {payload: "9411", type: "[Refdata] Load RefData"} 

の含有量であり、これは、ネットワークログ

enter image description here

@Effect() 
loadRefDataForId$ = this.actions$ 
    .ofType(LOAD_REFDATA_FOR_ID) 
    .pipe(
    map((action: LoadRefDataForId) => action.payload), 
    switchMap((id) => this.service.loadRefData(id) 
    .pipe(
    map((occupations) => { 
     return new LoadRefDataForIdSuccessful({ id: id, occupations: occupations } as RefDataPayload); 
    }), 
    catchError((err, caught) => { 
     console.log(caught); 
     return caught; 
    }) 
    )) 
); 

がなぜLoadRefDataForIdアクションを処理効果から取られますt XHRは、私がmergeMapを使っていてもキャンセルしましたか?解約は、この効果によって引き起こされる

+0

あなたがLoadRefDataForIdアクションを扱う効果のためのコードを追加することはできますか?この1つは要求の任意の並べ替えを送信することを担当していません –

+0

@ Jota.Toledoコードを追加しました!私は 'switchMap'を' mergeMap'に変更してみましたが、それはすべて機能しますが、なぜそれが理解できません。マージされた3つの独立したオブザーバブルが存在せず、それらの中の 'switchMap'の使用は、その特定のストリームにのみ影響を及ぼすべきですか? –

+0

なぜ閉じるフラグ?はい、それは「なぜこのコードは動作しないのですか?」という質問ですが、大きな違いがありますが、どうやって、どうやって、そしてなぜそれがうまくいくのか、最後には推論の質問があります。 –

答えて

2

@Effect() 
loadRefDataForId$ = this.actions$ 
    .ofType(LOAD_REFDATA_FOR_ID) 
    .pipe(
    map((action: LoadRefDataForId) => action.payload), 
    switchMap((id) => this.service.loadRefData(id) 
    .pipe(
    map((occupations) => { 
     return new LoadRefDataForIdSuccessful({ id: id, occupations: occupations } as RefDataPayload); 
    }), 
    catchError((err, caught) => { 
     console.log(caught); 
     return caught; 
    }) 
    )) 
); 

それでswitchMapを使用することにより、あなたはactions$ストリームを通過するだけで、最後のLoadRefDataForIdアクションが処理/考慮すべきであると語っています。

変更を:

@Effect() 
loadRefDataForId$ = this.actions$ 
    .ofType(LOAD_REFDATA_FOR_ID) 
    .pipe(
    map((action: LoadRefDataForId) => action.payload), 
    mergeMap((id) => this.service.loadRefData(id) 
    .pipe(
    map((occupations) => { 
     return new LoadRefDataForIdSuccessful({ id: id, occupations: occupations } as RefDataPayload); 
    }), 
    catchError((err, caught) => { 
     console.log(caught); 
     return caught; 
    }) 
    )) 
); 
+0

なぜなら、*私は*の理由を理解していますが、なぜ 'switchMap'が動作しないのか正確に把握していません。 'switchMap'を' mergeMap'でマージされた他の観察可能なストリームで使用することはできませんか? –

関連する問題