我应该在哪里调用具有Date.now或random等副作用的函数?

时间:2018-07-21 12:20:18

标签: ngrx ngrx-store ngrx-effects

例如,我需要当前日期或在reducer中随机排列列表。我应该为此使用效果吗?

 @Effect()
  foo$: Observable<Action> = this.actions$.pipe(
    ofType('Foo'),
    map(action => {
      //create result with Date.now or shuffle
      return {type: 'Foo_Result', payload: result}
    }

    )
  );

感觉像是过分杀伤力。最佳做法是什么?

1 个答案:

答案 0 :(得分:2)

我认为评论中已经提供了答案,但出于完整性考虑,让我在此处提供“真实”答案。

就像@cartant一样,您可以将这些副作用放入动作创建者中。这些动作创建者不必一定是纯粹的,这意味着您可以这样做:

const addTodo = ({
    id = uuid(),
    description = '',
    createDate = Date.now
  } = {}) => ({
    type: 'ADD TODO',
    payload: { id, description, createDate }
  })

这样做有一个额外的好处,那就是更容易的测试:

  • 在动作测试中,您测试idcreateDate是否存在,但不测试值
  • 要测试减速器,可以设置以下值addChat({id: 4654, description: 'a random todo', createDate: 111})

这就是为什么我更喜欢在动作创建者内部执行此操作的原因,如果愿意,可以在效果内部执行此操作,但不要在reducer函数内部执行。

reduce函数必须保持纯净

有关更多信息,请参考Let’s have a chat about Actions and Action Creators within NgRx