gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 14:12:04 25 4
gpt4 key购买 nike

我有一个 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com