我有一个redux saga设置,工作正常。我的一个分派任务是创建一个新订单,然后一旦创建了订单,我就想用更新后的状态做一些事情。
// this.props.userOrders = []
dispatch(actions.createOrder(object))
doSomethingWith(this.props.userOrders)
由于 createOrder 操作触发调用 API 的重订传奇,因此存在延迟,因此在我的函数 do 之前不会更新此 .props.user 命令某些内容被调用。我可以设置一个超时,但这似乎不是一个可持续的想法。
我已经阅读了有关Stack Overflow的类似问题,并尝试在相关的地方实现方法,但我似乎无法让它工作。我希望通过下面的代码,有人可以添加几行就可以做到这一点。
以下是相关的其他文件:
actions.js
导出const createUserOrder=(数据)=
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})
}
}
阿皮耶斯
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问题。您不应该在任何时候“等待”组件的生命周期函数/事件处理程序,而是应该利用html" target="_blank">存储的当前状态。
如果我没理解错,这是你目前的流程:
在 React 组件中分
派操作CREATE_USER_ORDER。此操作由您的呼叫创建用户订单
传奇使用。当您的创建订单传奇完成时,它会调度另一个“已完成”操作,您已经CREATE_USER_ORDER_SUCCEEDED该操作
。
您现在应该添加的是适当的减速器/选择器来处理您的CREATE_USER_ORDER_SUCCEEDED
:
这个CREATE_USER_ORDER_SUCCEEDED
操作应该由您的还原程序处理,以创建一个新的状态,其中填充了您状态中的一些“orders”属性。这可以通过选择器直接连接到您的组件,此时您的组件将被重新呈现并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)
减速机
case 'CREATE_USER_ORDER_SUCCEEDED':
return state.update('userOrders',
orders => orders.concat([payload.newUserOrder])
)
如果你真的需要副作用,那么把这些副作用添加到你的传奇故事中,或者创建一个新的传奇故事,采取成功的行动。
我正在Eclipse中使用Java运行selenium RC。我遇到的问题是selenium.click命令。我点击的链接加载一个新页面。有时需要5秒,有时需要2-3分钟。每次我看到页面加载时,在我的测试失败后,我立即得到消息“Timed out waiting for action to finish”。 我尝试使用Selenium.IsElementPresent检查正在加载的页面。但是,当我
我是一个新的反应,但我已经工作了很多年的Vue。当我需要等待一个动作完成时,我现在被困在一个区域。在操作完成后,我必须进行另一个操作调用或在那里执行一些操作。但它不会等待操作完成并开始执行下面的代码。 方法: 从其中调度操作的方法: 现在,在上面的代码中,重定向并不是在等待调度完成。我试过这个,但它不起作用:
他说,我有一个问题,我需要发送多个AJAX调用到同一个URL,但数据不同。我需要将其分块发送,并等待所有请求完成,然后再执行每个函数。 我做了一个简单的区块函数,将我的数组切片并将其分为多个组。 我的代码: 我需要在最后得到一个完整的数组来保存我所有的resp数据 我不能做$。当(),因为我不能命名函数,我也不知道如何使用$。deverred()在这个函数中你能帮我吗? 谢谢
问题内容: 我不确定如何处理这种情况,因为我是iOS开发和Swift的新手。我正在像这样执行数据获取: 我的loadShows()函数解析从加载到UIWebView的网站中获取的大量数据。问题是我在loadShows函数中有一个等待10秒钟左右的计时器。这允许页面中的javascript在开始解析数据之前完全加载。我的问题是完成处理程序在我的loadShows()之前完成。 我想做的是为“ isC
问题内容: 我有一个循环,可以调用API并将结果编译成数组。我如何等待所有调用完成后才能恢复执行?我看到了一系列有关如何等到打完一个电话的答案,但我不知道如何检查所有这些。如果我做一个while循环,一直等到’obj’是正确的长度,则页面只会停顿直到调用完成,这不是我想要的。请帮助? 问题答案: 如果您使用jQuery的deferred,这很容易。有一种方法,等待多个诺言完成,然后运行回调。那就是
问题内容: 我知道这个问题以前曾被问过,但是所有解决方案都不适合我。 我有一个将参数发送到API的函数,并以列表的形式返回数据。我有一个UITableView设置为使用该列表,但是它在列表分配给变量之前运行。 码: 如果不立即将其作为重复投票,我将不胜感激,这是我尝试的方法。 派遣组 信号量计时 运行变量 其中包括= self和= self 。 编辑:要求提取项目, 问题答案: 您不能-也不应该-