如何使EPIC完全动态化

时间:2017-11-01 14:11:29

标签: angular redux redux-observable redux-store

我使用带有redux / store的angular 2和redux-observable来形成史诗。我想要做的是一般的轮询器,所以我只需要编写一次轮询器。我有大约25个服务,我宁愿让动作传递什么类型的动作,它将执行的服务然后有重复的代码并写了大量的case或if语句:

我到目前为止的代码:

startPoller: Epic<Action<void>, Action<void>> = action$ =>
    action$.ofType(BankActions.DEPOSIT.POLL_DATA)
      .switchMap(action =>
        Observable.interval(1000)
          .takeUntil(action$.ofType(BankActions.DEPOSIT.STOP_POLLING))
          .mergeMap(count =>
            this.bankService.getDeposit.(action.payload)
              .map(payload => ({ type: BankActions.DEPOSIT.POLL_SUCCESS, payload }))
              .catch(error => Observable.of({
                type: BankActions.DEPOSIT.POLLING_FAILED,
                payload: error
              }))
        )
)

我想在伪代码中做什么:

startPoller: Epic<Action<void>, Action<void>> = action$ =>
    action$.ofType(BankActions.DEPOSIT.POLL_DATA || BankActions.WITHDRAW.POLL_DATA || InvestActions.STOCK_PRICE.POLL_DATA )
      .switchMap(action =>
        Observable.interval(1000)
          .takeUntil(action$.ofType(action.STOP_POLLING))
          .mergeMap(count =>
            this.bankService.getDeposit(action.payload)
              .map(payload => ({ type: BankActions.DEPOSIT.POLL_SUCCESS, payload }))
              .catch(error => Observable.of({
                type: BankActions.DEPOSIT.POLLING_FAILED,
                payload: error
              }))
        )
)

我猜测让它工作我可能需要制作某种类型的基本类型,每个需要轮询的动作/服务都需要扩展,然后我可以检查是否类型为&#39; PollerService& #39;或者键入&#39; PollerEpic&#39;然后我可以过滤那个?

1 个答案:

答案 0 :(得分:0)

有点不清楚你在问什么,但我想我可以回答一些事情。

您的伪代码ofType

action$.ofType(BankActions.DEPOSIT.POLL_DATA || BankActions.WITHDRAW.POLL_DATA || InvestActions.STOCK_PRICE.POLL_DATA )

可以通过将它们作为参数传递来完成; ofType将检查某个操作是否属于任何类型。

action$.ofType(BankActions.DEPOSIT.POLL_DATA, BankActions.WITHDRAW.POLL_DATA, InvestActions.STOCK_PRICE.POLL_DATA )

我看到伪代码中的下一件事是您希望匹配的操作提供STOP_POLLING类型。

.takeUntil(action$.ofType(action.STOP_POLLING))

目前还不清楚STOP_POLLING的值是否可以接受,通常redux类型变量的名称应与字符串相同,例如STOP_POLLING = 'STOP_POLLING'在这种情况下,它们无关紧要,因为它们都是相同的'STOP_POLLING'值。

如果您希望它们发生变化,我不会使用UPPER_CASE约定,因为这可能会让维护变得混乱:

// what an action _might_ look like
{
  type: BankActions.DEPOSIT.POLL_DATA,
  meta: {
    stopType: 'DEPOSIT_STOP_POLLING'
  }
}

// then used something like this:
.takeUntil(action$.ofType(action.meta.stopType))