2017-06-14 14 views
2

私はbagfavoritesの店を持っています。現在、アクションはREMOVE_FROM_BAGです。これにより、APIからバッグからアイテムを削除する副作用が発生し、REMOVE_FROM_BAG_COMPLETEが実際にストアから削除されます。他の効果の結果に依存するチェーン効果

MOVE_FROM_BAG_TO_FAVORITESという項目を追加して、bagから項目を削除し、favoritesに入れます。 remove API呼び出しが失敗した場合は、何も続行しないでください。全体的な流れは次のようになります。APIコールが失敗した場合

MOVE_BAG_TO_FAVORITES 
REMOVE_FROM_BAG 
@Effect Api Call 
REMOVE_FROM_BAG_COMPLETE 
ADD_TO_FAVORITES 

したがって、アイテムはバッグストアから削除したり、お気に入りリストに追加するべきではありません。お気に入りにアイテムを移動するためとして

// REMOVE_FROM_BAG side effect; API call; success removes item from the store 
@Effect() 
removeFromBag = this.actions$ 
    .ofType(REMOVE_FROM_BAG) 
    .switchMap(({ payload }) => this.bagService.remove(payload) 
    .map(() => ({ type: REMOVE_FROM_BAG_COMPLETE, payload }) 
    .catch(() => of({type: REMOVE_FROM_BAG_FAIL })) 
); 

、私はそれは同様に副作用としてREMOVE_FROM_BAGをトリガすることができますが、副作用は(すなわち、それをチェーン)成功した​​かどうかは確認してくださいするかどうかはわかりません。

@Effect() 
moveFromBagToFavorites = this.actions$ 
    .ofType(MOVE_FROM_BAG_TO_FAVORITES) 
    .mergeMap(({ payload }) => [ 
    { type: REMOVE_FROM_BAG, payload }, 
    { type: ADD_TO_FAVORITES, payload }, 
    ]); 

は、理論的には、これは動作するはずですが、私はAPIの呼び出しが失敗したため、REMOVE_FROM_BAGが失敗した場合に派遣されることからADD_TO_FAVORITESを防ぐするかどうかはわかりません。副作用のある行動を連鎖させるより良い方法はありますか?

答えて

3

不純なエフェクトコールは、純粋なエフェクトコールよりも失敗する可能性が高くなります。

私が最初に実行されるように、あなたの効果の呼び出しを持つことになりそう:

@Effect Api Call -- Effect 
API_CALL_COMPLETE -- Redux (should change state) 
    MOVE_BAG_TO_FAVORITES -- Redux 
    REMOVE_FROM_BAG -- Redux 
    REMOVE_FROM_BAG_COMPLETE -- Not necessary anymore 
    ADD_TO_FAVORITES -- Redux 

API呼び出しが失敗した場合、ロールバックは必要ありません。

+0

これは問題なく動作しますが、削除APIを呼び出すためにディスパッチする2つの別個のアクションを作成する必要があります。私はこれを避け、既存の削除エフェクトを使用してAPIを呼び出して、1つの場所でのみ実行するようにしています。 –

+2

2つの呼び出しが同じで、異なる効果がある場合は、異なるタイプIDを持つ2つのエフェクトアクションを作成します。はい、それは重複していますが、異なるコンテキストから呼び出され、異なる副作用を伴います。私はそれがはっきりとはっきりしていると思う。 – pixelbits