在 Flux/React 中分派级联/依赖异步请求

IT技术 javascript asynchronous reactjs reactjs-flux flux
2021-05-13 09:59:41

我知道这个问题以不同的方式被问了更多次,但我还没有找到“正确”的答案(也许只是没有),所以我正在寻找“最流畅”的答案。

简单的例子:

  • 两个组成部分 -LoginFormInformation
  • 用户必须提供他/她的登录信息,提交表格,然后他/她才有权“询问”信息(这应该在登录后自动完成)
  • 项目结构如下:

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

选项:

1.

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

2.

  • LoginForm._onSubmit() 电话 API.login()
  • 如果API.login()成功,它会调用LoginAction.loginSuccess()并且:
    1. 要么InfoAction.requestInfo()调用API.requestInfo()
    2. 或者API.requestInfo()然后调用InfoAction.infoSuccess()

3.

  • LoginForm._onSubmit() 电话 LoginAction.login()
  • InfoStore倾听LOGIN_OK行动并调用API.requestInfo()
  • API.requestInfo()调用InfoAction.infoSuccess()INFO_OK使用将要存储的特定信息的有效负载分派事件InfoStore

(4.)

调用 API/ServiceProvider 或 ActionCreatorscomponentWillMountcomponentDidMount看起来本质上很糟糕。不是一个真正的(好的)选择,但为了完整起见,我把它放在这里。

我的评价:

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

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

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

4.坏,坏,坏!

问题

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

1个回答

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

也就是说,这就是我将如何处理它。

  1. LoginForm.onSubmit调用LoginAction.login
  2. LoginAction电话API.login,一经成功,分派推出的东西的操作类型一样Constants.LOGGED_IN用的数据user_id
  3. A UserStore,侦听Constants.LOGGED_IN调用API.userInfo,传递user_id调度中的 。(让商店直接从 API 获取信息是其中一位 FB 人员说他们经常做的事情之一,为更新和此类性质的事情保留操作。)
  4. UserStore将信息保存到其中current_user并发出CHANGE
  5. 受影响的组件请求更新 UserStore

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

希望这是值得深思的!