首页 文章

为什么要使用redux-thunk或redux-saga来获取?

提问于
浏览
4

我一直在读,我应该使用redux-thunk或redux-saga来处理副作用 . 为什么不简单地使用这样的动作创建者来发送多个动作:

function loadProductActionCreator(dispatch) {
  dispatch({
    type: 'load_product',
  })
  fetch('api/product').then(
    function (r) {
      return r.json();
    }
  )
  .then(function (res) {
    dispatch({
      type: 'loaded_product',
      data: res
    })
  })
}

我试过了,它有效(complete code) . 所以我想一定有一些我不知道的不便之处 .

2 回答

  • 1

    你的代码类似于thunk的代码 .

    按照 redux docs,行动应该是纯粹的 . 并且它们应始终为相同的输入参数返回相同的值 . 通过使用 fetch ,您允许操作返回非特定值,而不是来自服务器的值,这意味着操作响应可能会随时间而变化 .

    这叫做 side effects . 并且它默认情况下在redux操作中 .

    但为什么?

    是的,你可以像你一样在里面输入它,在小应用程序中它并不重要 .

    在较大的应用程序中,使用 redux-saga 有以下好处:

    • 动作是可预测的,它们只返回有效载荷
    {
      type: 'FETCH_POSTS',
      params: {
        category: 'programming'
      }
    }
    
    • 然后构建中间件,该中间件将对执行实际API请求所需的所有数据执行操作

    Possible advantages:

    • 清洁代码库(但可能是较小应用程序的开销)

    • 将"dummy"操作与执行请求和实际API中间件所需的所有信息分离

    • 请求参数直接在redux dev工具中可见

    • 可能很容易 debouncethrottle 抓取可能真的很难用redux-thunk

    • 可以轻松组合操作(等待另一个事件/获取,链事件)

    • 可以停止运行任务

    从个人经验来看,在一个项目(更大的代码库)上我们已经开始使用 redux-thunk ,但后来我们需要集成更多高级功能,如限制和操作之间的一些依赖关系 . 所以我们把所有内容重写为 redux-saga ,它对我们来说效果很好 .

  • 4

    你在这里复制redux-thunk . 纯redux动作创建者应该返回要调度的动作对象,而不是自己调度动作(参见redux doc on action creator) .

    为了更好地理解为什么你的技术是redux-thunk的复制,请查看其作者的this post

相关问题