reactjs - 使用 redux saga 时等待 redux action 完成调度

标签 reactjs redux redux-saga

我有一个 redux saga 设置,运行良好。我的调度之一是创建一个新订单,然后一旦创建,我想用更新后的状态执行操作。

// this.props.userOrders = []

dispatch(actions.createOrder(object))

doSomethingWith(this.props.userOrders)

由于 createOrder 操作触发了调用 API 的 redux saga,因此存在延迟,因此在调用我的函数 doSomethingWith 之前不会更新 this.props.userOrders。我可以设置一个超时,但这似乎不是一个可持续的想法。

我已经阅读了 Stack Overflow 上的类似问题,并尝试实现相关的方法,但我似乎无法让它工作。我希望通过下面的代码,有人只需添加几行即可完成此操作。

以下是相关的其他文件:

actions.js

导出 const createUserOrder = (数据) => ({ 类型:'CREATE_USER_ORDER', 数据 })

Sagas.js

function * createUserOrder () {
  yield takeEvery('CREATE_USER_ORDER', callCreateUserOrder)
}

export function * callCreateUserOrder (newUserOrderAction) {
  try {
    const data = newUserOrderAction.data
    const newUserOrder = yield call(api.createUserOrder, data)
    yield put({type: 'CREATE_USER_ORDER_SUCCEEDED', newUserOrder: newUserOrder})
  } catch (error) {
    yield put({type: 'CREATE_USER_ORDER_FAILED', error})
  }
}

Api.js

export const createUserOrder = (data) => new Promise((resolve, reject) => {
  api.post('/userOrders/', data, {headers: {'Content-Type': 'application/json'}})
    .then((response) => {
      if (!response.ok) {
        reject(response)
      } else {
        resolve(data)
      }
    })
})

订单减少器:

case 'CREATE_USER_ORDER_SUCCEEDED':
   if (action.newUserOrder) {
      let newArray = state.slice()
      newArray.push(action.newUserOrder)
          return newArray
       } else {
       return state
   }

最佳答案

这感觉就像 XY Problem 。您不应该在任何时候在组件的生命周期函数/事件处理程序中“等待”,而应该利用存储的当前状态。

如果我理解正确的话,这是您当前的流程:

You dispatch an action CREATE_USER_ORDER in your React component. This action is consumed by your callCreateUserOrder saga. When your create order saga is complete, it dispatches another "completed" action, which you already have as CREATE_USER_ORDER_SUCCEEDED.

您现在应该添加适当的 reducer /选择器来处理您的CREATE_USER_ORDER_SUCCEEDED:

CREATE_USER_ORDER_SUCCEEDED 操作应由您的 reducer 处理,以创建一个新状态,其中填充您状态中的某些“订单”属性。这可以通过选择器直接连接到您的组件,此时您的组件将被重新渲染并填充 this.props.userOrders

<小时/>

示例:

组件

class OrderList extends React.PureComponent {
  static propTypes = {
    userOrders: PropTypes.array.isRequired,
    createOrder: PropTypes.func.isRequired,
  }

  addOrder() {
    this.props.createOrder({...})
  }

  render() {
    return (
      <Wrapper>
        <Button onClick={this.addOrder}>Add Order</Button>
        <List>{this.props.userOrders.map(order => <Item>{order.name}</Item>)}</List>
      </Wrapper>
    )
  }
}

const mapStateToProps = state => ({
  userOrders: state.get('userOrders'),
})

const mapDispatchToProps = {
  createOrder: () => ({ type: 'CREATE_ORDER', payload: {} }),
}

export default connect(mapStateToProps, mapDispatchToProps)(OrderList)
<小时/>

reducer

case 'CREATE_USER_ORDER_SUCCEEDED':
  return state.update('userOrders',
    orders => orders.concat([payload.newUserOrder])
  )
<小时/>

如果您确实需要副作用,请将这些副作用添加到您的传奇中,或者创建一个采用 SUCCESS 操作的新传奇。

关于reactjs - 使用 redux saga 时等待 redux action 完成调度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53431687/

相关文章:

javascript - Normalizr 不处理信封中的数据

javascript - 当函数名称是保留字时如何使用 Redux Saga "call"函数以及如何进行链式函数调用?

javascript - 如何将发出的事件事件绑定(bind)到 redux-saga 中?

reactjs - Jest 测试失败,警报未定义

javascript - 商店更改时更新组件

reactjs - Redux:请求成功或来自组件的错误(使用redux-saga)

javascript - 无法使用选择器从Redux存储中获取值

javascript - Reactjs this.refs 与 document.getElementById

reactjs - 如何在get请求期间显示axios的进度(不是下载或上传)

javascript - 如何在具有多个属性的 Semantic-UI-React 中查看值?