Redux动作与Redux-Saga动作

时间:2019-09-04 09:38:59

标签: reactjs redux redux-saga

何时需要使用redux动作和redux saga动作,我感到两难。

我不是要问何时使用redux以及何时使用redux-saga。但是我想知道,当我们使用redux saga时,我们需要使用哪种redux动作。还是在使用redux saga时不需要使用redux动作?

在使用redux-saga时,请帮助我了解redux的用例。

1 个答案:

答案 0 :(得分:1)

不确定这是否是您的意思,但以防万一:在redux和redux-saga之间,动作本身是无法区分的。在这两种情况下,动作都是具有类型的对象,并且可能是有效载荷。例如,这是一个动作:

{
  type: 'DO_STUFF',
  value: 3,
}

当您调度一个动作时,它首先要进入您的中间件。 Redux-saga是中间件的一个示例,它可以决定是否要对该操作执行任何操作。如果动作通过了redux-saga,则转到减速器。

所以我相信您要问的是:什么时候应该使用传奇处理动作,什么时候应该使用减速器处理动作。答案归结为首先创建redux-saga和类似中间件的原因:

Reducer始终是同步纯函数。

因此,当您要执行异步和/或不纯净的操作时,将使用传奇。异步部分是最常出现的事情。如果要获取数据,它将是一个传奇。如果您想设置一个间隔来随时间做某事,那将是一个传奇。

在极少数情况下,您可能会有一些同步但不纯净的东西,也可能是您将其置入传奇的东西。我最近的一个例子是我想调度一个动作,而不是更新应用程序状态,而是希望它可以将某些内容保存到本地存储中。这是同步发生的,但是由于它是副作用,所以我最好将其放到一个传奇中。


根据评论中的要求,对同步但不纯的澄清。如果函数在返回之前已完成所有工作,则它是同步的。如果函数1)没有副作用,并且2)对于给定的输入,该函数是纯函数,则它始终返回相同的输出。

副作用是当函数通过其返回值以外的方式更改其自身外部的某些内容时。使用纯函数,我应该能够调用它并假定该函数之外没有任何变化。例如:

localStorage.setItem('data', 'hello world');
doSomething();
console.log(localStorage.getItem('data'));

如果我对doSomething一无所知,只知道它是纯净的,那么我可以肯定localStorage.getItem('data')将返回“ hello world”。但是从另一方面来说,如果doSomething不纯净,那么我就无法做出这样的假设。原则上,可以更改本地存储中的值,从而生成不同的日志语句。

因此,尽管同步,修改本地存储的函数(如以下)仍然不完善:

const doSomething = (value) => {
  localStorage.setItem('data', value);
}

第二种可能不纯的方法是,如果它不总是为相同的输入返回相同的东西。例如,以下功能是同步的但不纯:

const getTime = () => {
  return Date.now();
}

如果我多次打电话,通常每次我都会得到不同的号码。