Javascript Redux应用程序业务逻辑不';不影响国家?

Javascript Redux应用程序业务逻辑不';不影响国家?,javascript,redux,redux-thunk,Javascript,Redux,Redux Thunk,我有一个应用程序,它使用Oauth2“重定向流”对用户进行身份验证,即用户被重定向到另一个网站登录,然后被重定向回我的网站 文档和其他来源似乎都声称业务逻辑应该放在action创建者或reducer中。但是,我有一个login()函数,它不会以任何方式更改状态,它所做的是将应用程序的当前状态保存为本地存储中的普通对象,然后将用户重定向到授权服务器。当用户登录并被重定向回时,状态将被恢复(通过另一段代码),并作为初始状态反馈给my store creator函数 我的问题是:login函数的逻辑只

我有一个应用程序,它使用Oauth2“重定向流”对用户进行身份验证,即用户被重定向到另一个网站登录,然后被重定向回我的网站

文档和其他来源似乎都声称业务逻辑应该放在action创建者或reducer中。但是,我有一个
login()
函数,它不会以任何方式更改状态,它所做的是将应用程序的当前状态保存为本地存储中的普通对象,然后将用户重定向到授权服务器。当用户登录并被重定向回时,状态将被恢复(通过另一段代码),并作为初始状态反馈给my store creator函数

我的问题是:
login
函数的逻辑只是检索状态,但不会以任何方式更改状态,因此它不属于减速机。它也不会返回动作创建者定义的动作。我应该把它放在我的应用程序结构的什么地方

有一个实际上不创建动作的动作创建者“可以”吗?我现在用redux thunk做这件事(因为我需要
getState()
),它工作起来没有任何问题,但感觉不对,因为它实际上不是一个“动作创建者”,另一方面,我还有一个
logout()
函数,它确实返回一个动作,所以感觉它们应该住在同一个地方。我想这是一种极端的情况,但不是真的,因为我可以想出很多理由,以这种方式保存状态,并将访问者重定向到其他网站(甚至只是保存状态而不重定向)

另外,我知道有一些库可以自动将我的redux存储与localStorage同步,但这并不是问题的关键

编辑:一些澄清:

关于将业务逻辑放在何处,请参见: 对于减速机或动作创建者中到底应该包含哪些逻辑片段,没有一个明确的答案

继续读下去,我清楚地知道,我应该在两个地方放置业务逻辑,要么放在reducer中,要么放在action creator中。现在,因为我想做的事情不会影响状态,而减缩器的定义会影响状态,所以我倾向于将这种逻辑放在动作创建者中

关于动作创建者的文档:动作创建者正是创建动作的函数。很容易将“行动”和“行动创造者”这两个术语混为一谈,所以请尽量使用正确的术语。[…]在Redux中,动作创建者只需返回一个动作

actions:actions上的文档是纯JavaScript对象

我的登录示例的伪代码:

function login() {
    // retrieving and serializing the state, then:
    localStorage.set('my_app_id_state', my_serialized_state);
    window.location = url_to_authorization_service;
}
这段代码显然在动作创建者中没有位置,因为我没有返回动作,这是动作创建者的目的。然而,我仍然需要检索状态,所以我也不能使它完全独立

同样,问题是我应该把这段代码放在我的应用程序结构中的什么地方


同样,代码可以正常工作,一切都很好,所以我想这更像是一个学术问题,但我在这里显然违反了Redux的基本规则,这让我非常恼火。也许这只是个例外?

这是一个很好的问题,让我意识到我做错了什么。所以希望这个答案至少对双方都有帮助:)

以改编自以下内容的示例为例:

私人活动

function oauth(url) {
 return (dispatch) => {
   dispatch({
    type: types.OAUTH_LOGIN,
    url
   });
 };
}
由动作创建者调用(返回函数)

然后在组件中依次调用操作,如下所示:

login() {
 return this.props.dispatch(loginToApi());
}
因此,回答您的问题的一种方法是将您的业务逻辑放在私有方法中,然后由动作创建者调用该方法

可能有一种更优雅的方式,但我在上面提到的文档中就是这样做的

关于在本地存储中存储状态的登录逻辑:我认为您不需要这个。Redux商店正在为您管理状态。

在twitter上回复,我将得出结论,这是文档中概述的规则的例外


您好,感谢您抽出时间回答。很抱歉,如果我的问题让人困惑,我想举个例子,说明我需要在我的应用程序中做一些不影响其状态的事情。在Redux文档中:“操作是将数据从应用程序发送到应用商店的有效信息。[…]操作是普通JavaScript对象。操作必须具有类型属性…”在您的示例中,您没有返回普通对象,我在登录函数中也没有这样做。因此,我们两人都没有遵循行动应该是什么的规范,这就是这里的问题:)我现在编辑了我的问题,也许现在我问的问题更清楚了。哈,说得好!让我编辑我的答案。同时,你看到了吗?我想你的解决方案在那里。谢谢,但我不认为我会变得更聪明。异步动作创建者实际上不会返回普通对象,因此我想我应该将文档作为“纯”redux应用程序的规则来阅读,即没有任何中间件,但这听起来很奇怪,因为中间件是redux最强大的功能之一(很少情况下你根本不需要任何中间件)。最后,一个异步动作创建者调用了其他动作创建者,并最终有效地完成了它应该做的事情——分派影响状态的普通对象动作。没问题,谢谢您的讨论。我给丹·阿布拉莫夫发了推特,希望他能看到。但是是的,我现在要继续违反规则。
login() {
 return this.props.dispatch(loginToApi());
}