在 Flux/React 中调度级联/依赖异步请求

Posted

技术标签:

【中文标题】在 Flux/React 中调度级联/依赖异步请求【英文标题】:Dispatching cascading/dependent async requests in Flux/React 【发布时间】:2015-09-13 14:57:41 【问题描述】:

我知道这个问题已经被多次以不同的方式问过,但我还没有找到“正确”的答案(也许根本就没有),所以我正在寻找“最通量”的答案.

简单示例:

两个组件 - LoginFormInformation 用户必须提供他/她的登录信息,提交表单,然后他/她才有权“询问”信息(这应该在登录后自动完成)

项目结构如下:

+ actions
|-- LoginAction
|-- InfoAction
+ api
|-- API
+ components
|-- LoginForm
|-- Information
+ stores
|-- LoginStore
|-- InfoStore

选项:

1.

LoginForm._onSubmit() 致电LoginAction.login() LoginAction.login() 使用回调/承诺调用 API.login(),然后在成功登录的情况下调用 InfoAction.requestInfo()

2.

LoginForm._onSubmit() 致电API.login() 如果API.login() 成功,它会调用LoginAction.loginSuccess() 并且:
    InfoAction.requestInfo() 调用 API.requestInfo()API.requestInfo() 然后调用 InfoAction.infoSuccess()

3.

LoginForm._onSubmit() 致电LoginAction.login() InfoStore 监听 LOGIN_OK 动作并调用 API.requestInfo() API.requestInfo() 调用 InfoAction.infoSuccess() 并调度 INFO_OK 事件,其中包含将存储在 InfoStore 中的特定信息的有效负载

(4.)

componentWillMountcomponentDidMount 调用API/ServiceProvider 或ActionCreators 似乎天生就不好。不是一个(好的)选择,但为了完整起见,我把它放在这里。

我的评价:

1。 擅长基于回调/承诺的 JS 的“旧风格”,但似乎不是 Flux 方式,因为我们应该避免更改操作。只需一劳永逸。

2。 稍微打破“通量图” - 组件与 API 或 ServiceProviders 对话,而不是直接与 ActionCreators 对话。我不确定这是好是坏。它似乎是“单向”(好)并避免了循环要求(好)。我个人更喜欢这个选项(特别是 2.2.一个)

3。 我个人避免使用这种方法,因为这意味着 Store 与 API/ServiceProvider 交谈会破坏“Flux 图”,但同样,我不知道这是否真的很糟糕(也许只是我不习惯 Flux 的做法事物)。甚至@fisherwebdev 似乎也可以接受(例如https://***.com/a/26637579/5053194),但这真的是最好的方法吗?

4。 糟糕,糟糕,糟糕!

问题

哪一个是“最好的”和/或是否有任何其他“最通量”的选项可以做到这一点?

【问题讨论】:

【参考方案1】:

我最近观看了一个内容丰富的小组讨论,其中有两位 Facebook 开发人员正在从事使用 React/Flux 的大型项目。令我印象深刻的是,他们对同一个问题采取了完全不同的方法——而且看起来都非常好。

也就是说,这就是我的处理方式。

    LoginForm.onSubmit 致电LoginAction.loginLoginAction 调用 API.login,成功后,Dispatcher 使用 user_id 的数据启动类似 Constants.LOGGED_IN 的 actionType 监听Constants.LOGGED_INUserStore 调用API.userInfo,传递调度中的user_id。 (让商店直接从 API 获取信息是 FB 人员说他们经常做的事情之一,为更新和类似性质的事情保留操作。) UserStore 将信息保存到其 current_user 并发出 CHANGE 受影响的组件请求更新到UserStore

现在,如果您想变得更棘手,您可以让商店为其emit 方法添加参数,以便受影响的组件可以获取 (a) 更改的性质和 (b) 实际数据。

希望这是值得深思的!

【讨论】:

你可能就在这里,但我个人认为这打破了“通量流程图” - Broken flux diagram 是的,FB 开发人员似乎对此没意见(他们可能是这方面的权威问题),但我只想在一个地方有异步代码。第二件事是它可能导致“循环要求” - 1. API 要求 ActionCreator (AC) 调用 AC.infoReceived() 2. 当组件这样说时,AC 要求 API 调用 API.getNextInfo() 哦,我不一定要在这里谈论“用户信息” - 只是一些“一般信息”(第二天的天气报告,一天的图片)只有在登录后才能访问(behing paywall.. .)。但这只是为了澄清我的思路,在这种情况下应该没有区别。 @TooManyQuestions,你最后得到了什么?

以上是关于在 Flux/React 中调度级联/依赖异步请求的主要内容,如果未能解决你的问题,请参考以下文章

React、Flux、React-Router 调度错误 - 可能的批处理更新解决方案?

Flux+React.js - 缓存 API 请求响应

在 Flux/React.js 中,在哪里初始化 jQuery 插件?

如何在 Flux/React 中测试动作?

登录ajax请求Flux React?

调度队列异步调用