3

我有一个bag和的商店favorites。目前有一个行动REMOVE_FROM_BAG。这会触发一个副作用,即从您的包中移除该项目的 API,该 API 调度REMOVE_FROM_BAG_COMPLETE实际上将其从商店中移除。

我们正在添加一个动作,MOVE_FROM_BAG_TO_FAVORITES它将删除一个项目bag并将其放入favorites. 如果删除 API 调用失败,则不应继续执行任何其他操作。整体流程将是:

MOVE_BAG_TO_FAVORITES
REMOVE_FROM_BAG
@Effect Api Call
REMOVE_FROM_BAG_COMPLETE
ADD_TO_FAVORITES

因此,如果 Api 调用失败,则不应从包存储中删除该项目或将其添加到您的收藏夹列表中。

// 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 调用失败而失败ADD_TO_FAVORITES的情况下被调度。REMOVE_FROM_BAG有没有更好的方法来链接具有副作用的操作?

4

1 回答 1

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 调用失败,则无需回滚。

于 2017-06-14T20:54:56.410 回答