为啥我要使用 Redux Promise Middleware 而不是 Redux Promise?

Posted

技术标签:

【中文标题】为啥我要使用 Redux Promise Middleware 而不是 Redux Promise?【英文标题】:Why would I use Redux Promise Middleware over Redux Promise?为什么我要使用 Redux Promise Middleware 而不是 Redux Promise? 【发布时间】:2017-10-26 08:50:47 【问题描述】:

我使用过Redux Promise,但似乎Redux Promise Middleware 具有更多功能,例如调度多个附加了“PENDING”或“FULFILLED”的操作。

为什么我要使用一个而不是另一个?

【问题讨论】:

【参考方案1】:

我个人更喜欢 Redux Promise Middleware 作为中间件,因为它支持乐观更新;调度待处理、已完成和已拒绝的操作;并与 Redux Thunk 配合使用以链接异步操作。

例如,您可以在 reducer 中使用带有 _PENDING_FULFILLED 的操作,并使用进度条等更新 UI。

【讨论】:

【参考方案2】:

Redux Pomise 中间件有一个替代方案。 Redux Auto 具有与 redux-promise-middleware 相同的 API,并在底层提供了一系列实用程序模式,以减少您需要编写的样板代码。

我们的想法是让每个action in a specific file。将文件中的服务器调用与“待处理”、“已完成”和“已拒绝”的减速器功能放在一起。这使得处理 Promise 变得非常容易。

它还会自动将helper object (called "async") 附加到您的状态原型,允许您在 UI 中跟踪请求转换。

示例:

数据/serverThing.js

export function pending (posts, payload)
  return posts


export function fulfilled (posts, payload, result)
  return result.serverResponse


export function rejected (posts, payload, error)
  return posts;


export function action (payload) 
  return Promise.resolve(serverResponse: [1,2,3,4])

用户界面

import React  from "react"
import actions from 'redux-auto'
import  connect  from 'react-redux'

class Foobar extends Component 

  const currentLoadingData = this.props.data.async.serverThing;

  if(currentLoadingData instanceof Error)
    var data = currentLoadingData.message
   else if(true === currentLoadingData )
    var data = "Loading..."
   else 
    var data = this.porps.data.join();
  

  render () 
    return (
      <div>
        <button onClick=()=>actions.data.serverThing()>Do something!</button> 
         data 
      </div>
    )
  


const mapStateToProps = (  data ) => 
  return  data 
;

export default connect( mapStateToProps )(Foobar);

了解以上来源。 redux-auto 自动创建动作并根据文件结构将它们连接到 reduce。其中文件夹名称成为状态属性的名称。文件夹中的文件是要对状态的该部分执行的操作。

这是一个完整的redux-auto: helloworld project

【讨论】:

以上是关于为啥我要使用 Redux Promise Middleware 而不是 Redux Promise?的主要内容,如果未能解决你的问题,请参考以下文章

使用 redux-promise 处理 redux 错误的正确方法

链接 redux-actions 和 redux-promise-middleware

如何确保所有使用redux的promise中的promise顺序正确?

使用 redux-promise 调用 API 时 Redux 状态未更新

使用 redux-promise 继续获得未定义的 'dispatch'

如何使用 redux 和 redux-promise 将多个 axios 调用合并到一个有效负载中?