【问题标题】:Converting promise-based React app to redux-saga: how do I set React component variables?将基于 Promise 的 React 应用程序转换为 redux-saga:如何设置 React 组件变量?
【发布时间】:2019-04-29 11:55:03
【问题描述】:

我是 redux-saga 的初学者,作为一项任务,我想尝试将现有的大型 React 应用程序从 Promises 转换为 redux-saga。我正在取得一些进展,但我遇到的一个问题是,当我使用 Promises 时,我能够根据承诺是履行还是拒绝来设置组件局部变量。现在看来我只是将请求“移交”给 redux-saga 并且永远不知道(在调用站点中)它是否完成,现在我不知道(在我的组件中)它是否成功。

例如,假设我有一个基于 Promise 的调用来获取我用户的游戏

getCurrentGamesForUser = (nickname, token) => {
    return logic.getGamesForUser(nickname, token)
      .then(currentGames => {
        this.needToUpdateGamesFlagFromSocketIO = false
        this.setState({currentGames})
        sessionStorage.setItem('currentGames', JSON.stringify(currentGames))
      })
      .catch(({message}) => this.onError(message))
  }

如果我的承诺成功,我在这里设置标志this.needToUpdateGamesFlagFromSocketIO 以及sessionStorage 变量。

现在,据我了解,我会将其转换为

 getCurrentGamesForUser = (nickname, token) => {
    this.props.dispatch(getCurrentGames(nickname,token))
  }

这很好用。如果有错误,将从 saga 发送到商店,我的组件会反映这一点。

但是我该如何处理本地标志和会话存储呢?我还需要将这些添加到商店吗?这似乎是一种混乱的方式,除非我为每个组件都有一个单独的商店,每个组件都有一个本地商店,这看起来也很混乱。我在这里看到了一些关于类似主题的讨论,https://github.com/redux-saga/redux-saga/issues/907,但似乎没有答案。我确定我错过了处理所有这些的“redux 方式”,因此欢迎任何指导。

【问题讨论】:

    标签: javascript reactjs redux redux-saga redux-store


    【解决方案1】:

    Redux-Saga 旨在将组件外部所有基于操作的触发器卸载到单独的 saga 范围内。所以不幸的是,没有直接的方法来实现你所要求的。尽管您提到的 issue 跟踪器中有一些建议的解决方法。

    redux-saga 的主要目标是通过将副作用卸载到单独的执行上下文来轻松管理副作用。权衡之一是只能通过component -> action -> saga -> store -> component 进行通信。因此对于上述要求,我相信使用 redux-saga 会适得其反。

    也就是说,您始终可以将redux-saga 与其他基于承诺/回调的方法(例如redux-thunk)结合使用。

    上述用例更适合基于回调的实现,而使用 redux-saga 可以很好地处理完全隔离到 redux 的副作用。

    【讨论】:

    • 如何将redux-sagaredux-thunk 结合起来?简单地将 thunk 放在 action creators 中,并单独维护 sagas?也许更重要的是,使用 thunk 将如何让您知道 thunk 是否成功? (我对 thunk 不太熟悉)
    • 分别维护 thunk 和 sagas。 redux-thunk 允许您从动作创建者返回函数,而不是普通对象。它甚至会注意从 dispatch 中返回 thunk 的返回值,因此只要返回 Promises,您就可以链接它们。推荐阅读:github.com/reduxjs/redux-thunk#user-content-composition
    • 我阅读了文档,它看起来不错。但是 - 也许我错过了明显的 - 为了让 thunk 知道异步调用何时完成,我需要将异步调用放在 thunk 中,并将其从 saga 中删除,对吗?这违背了传奇的目的。还有另一种我想念的方法吗?我发现了这个,github.com/diegohaz/redux-saga-thunk,这会有所帮助,但我试图不添加包。
    • 如果需要维护组件内部的执行状态,为什么需要redux-saga redux-thunk 或者您当前的实现已经足够好了。佐贺破坏了目的。但是如果你需要做一些除了 thunk 之外的副作用,你需要调度另一个动作,这个 saga 会听
    • 你是绝对正确的。但正如 git 线程中提到的,这仍然是一个未解决的问题。你唯一要做的就是寻找其他一些第三方库,或者从存储在 redux 中的信息中获取 mapStateToProps 中的那些私有数据。
    猜你喜欢
    • 1970-01-01
    • 2020-06-19
    • 2018-02-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-27
    • 1970-01-01
    相关资源
    最近更新 更多