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

Where should I call functions with side effects like Date.now or random?

例如,我需要当前日期或在 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}
    }

    )
  );

感觉有点矫枉过正。最佳做法是什么?

我认为评论中已经提供了答案,但为了完整起见,让我在这里提供一个 "real" 答案。

如@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})

这就是为什么我更赞成在 action creator 中执行此操作的原因,如果您愿意,可以在 effect 中执行此操作,但不要在 reducer 函数中执行此操作。

reducer 函数必须保持纯净.

更多信息,我推荐你Let’s have a chat about Actions and Action Creators within NgRx