Javascript 在Flux/React中调度级联/依赖异步请求
我知道这个问题在不同的口味中被问了很多次,但我还没有找到“正确”的答案(也许根本就没有),所以我正在寻找“最频繁”的答案 简单的例子:Javascript 在Flux/React中调度级联/依赖异步请求,javascript,asynchronous,reactjs,reactjs-flux,flux,Javascript,Asynchronous,Reactjs,Reactjs Flux,Flux,我知道这个问题在不同的口味中被问了很多次,但我还没有找到“正确”的答案(也许根本就没有),所以我正在寻找“最频繁”的答案 简单的例子: 两个组件-LoginForm和信息 用户必须提供他/她的登录信息,提交表单,然后他/她才有权“询问”信息(这应在登录后自动完成) 沿着这些路线的项目结构: + actions |-- LoginAction |-- InfoAction + api |-- API + components |-- LoginForm |-- Information + sto
- 两个组件-
和LoginForm
信息
- 用户必须提供他/她的登录信息,提交表单,然后他/她才有权“询问”信息(这应在登录后自动完成)
- 沿着这些路线的项目结构:
+ actions |-- LoginAction |-- InfoAction + api |-- API + components |-- LoginForm |-- Information + stores |-- LoginStore |-- InfoStore
调用LoginForm.\u onSubmit()
LoginAction.login()
使用回调/承诺调用LoginAction.login()
,然后在成功登录的情况下调用API.login()
InfoAction.requestInfo()
调用LoginForm.\u onSubmit()
API.login()
- 如果
API.login()
- 调用
API.requestInfo()
- 或者
调用API.requestInfo()
InfoAction.infoSuccess()
- 调用
调用LoginForm.\u onSubmit()
LoginAction.login()
侦听InfoStore
操作并调用LOGIN\u OK
API.requestInfo()
调用API.requestInfo()
,并将InfoAction.infoSuccess()
事件与要存储在INFO\u OK
中的特定信息的有效负载一起发送InfoStore
componentWillMount
或componentDidMount
调用API/ServiceProvider或ActionCreator似乎天生就不好。这不是一个很好的选择,但我把它放在这里是为了完整性
我的评价:
一,。
在基于回调/承诺的JS的“旧式”中很好,但似乎不是Flux方式,因为我们应该避免更改操作。只要开火就可以了
二,。
稍微打破了“流量图”——组件与API或服务提供商对话,而不是直接与ActionCreator对话。我不确定这是好是坏。它似乎是“单向的”(好),避免了循环要求(好)。我个人更喜欢这个选项(特别是2.2.1)
三,。
我个人避免使用这种方法,因为这意味着与API/ServiceProvider对话会打破“流量图”,但我也不知道这是否真的很糟糕(可能只是我不习惯使用流量做事的方式)。甚至@fisherwebdev似乎对此也没问题(例如),但这真的是最好的方法吗
四,。
糟糕,糟糕,糟糕
问题:
哪一个是“最好的”和/或是否有其他“流量最大”的选项可以做到这一点?我最近观看了一场信息丰富的小组讨论,其中有两位Facebook开发人员正在从事使用React/Flux的大型项目。让我印象深刻的是,他们对同一个问题采取了完全不同的方法——而且两种方法看起来都非常好 也就是说,我会这样处理
LoginForm.onSubmit
调用LoginAction.login
LoginAction
调用API.login
,成功后,Dispatcher启动一个类似于常量的actionType。使用用户id的数据登录
UserStore
,监听常量。登录的调用API.userInfo
,传递调度中的用户id
。(让一家商店直接从API获取信息是一位FB员工说他们经常做的事情之一,为更新和类似性质的事情保留操作。)
UserStore
将信息保存到其当前用户中
并发出更改
UserStore
emit
方法添加参数,以便受影响的组件可以获取(a)更改的性质和(b)实际数据
希望这是值得思考的 你可能就在这里,但我个人认为这打破了“流量流程图”-是的,FB开发者似乎同意这一点(他们可能是这方面的权威),但我只希望在一个地方有异步代码。第二件事是,它可能导致“循环要求”-1。API要求ActionCreator(AC)调用
AC.infoReceived()
2。AC要求API在组件这么说时调用API.getNextInfo()
。哦,我这里不一定指“用户信息”-只是一些“一般信息”(第二天的天气报告,一天的图片),只有在登录后才能访问(behing paywall…)。但这只是为了澄清我的思路,在这种情况下不应该有什么不同。@TooManyQuestions,你最终得到了什么?