Javascript 在提取完成之前发生重定向
我在重定向回上一页时没有什么问题——这发生得太快了 基本上我有这样的功能组件:Javascript 在提取完成之前发生重定向,javascript,reactjs,redux,Javascript,Reactjs,Redux,我在重定向回上一页时没有什么问题——这发生得太快了 基本上我有这样的功能组件: export const CreateRecordingControls = ({ recording, handleCreateRecording }) => { const history = useHistory(); const handleCreate = async () => { const promise = Promise.resolve(handleCreateRec
export const CreateRecordingControls = ({ recording, handleCreateRecording }) => {
const history = useHistory();
const handleCreate = async () => {
const promise = Promise.resolve(handleCreateRecording(recording));
await Promise.all([promise]).then(function () {
history.push('/home');
});
}
return (
<Fragment>
<button onClick={() => handleCreate()}>Create</button>
</Fragment>
);
}
const mapDispatchToProps = dispatch => ({
handleCreateRecording: recording => {
dispatch(handleCreateRecording(recording));
}
});
const CreateRecordingControlsView = withRouter(connect(null, mapDispatchToProps)(CreateRecordingControls));
export default CreateRecordingControlsView;
这是到减速器:
export default (state = [], action) => {
switch (action.type) {
case 'CREATE_RECORDING_BEGIN':
return {
...state,
loading: true,
error: null,
finished: false
}
case 'CREATE_RECORDING_SUCCESS':
return {
data: action.payload,
loading: false,
finished: true
}
default:
return state;
}
}
但在这种情况下,它仍然显示“/home”路由上的组件将在调用handlesuccess之前装载。Home组件包含刚添加的录制的列表。目前看来,谁先到达那里是一场竞赛。到目前为止,新创建的录音在列表中,但我认为这仍然是错误的行为
如何在重定向之前等待成功案例完成 分派函数不会返回承诺,因此您不必等待任何东西。使用
redux-thunk
如果要等待分派结果,则必须在动作创建者中执行此操作:在此处分派handleCreateRecordingSuccess
另一种方法是观察状态值
finished
,当它获得您感兴趣的值时,将其推送到您的历史记录中。获取承诺此时似乎没有返回,因此promise.resolve将立即发生
我会尝试从获取中返回实际承诺,即等待handleCreateRecording获取的结果,然后在发送操作时返回该结果。承诺、决心和承诺。这一切都不是必需的。如果您想捕获任何获取错误,那么您可以将等待包装在try/catch块中。
handleCreateRecording(recording)
立即返回,这意味着Promise。所有([Promise])
都将在AJAX调用完成之前解决,您必须等待finished
设置为true
(使用MapStateTops
)。我曾尝试在MapStateTops中使用“finished”,但在这种情况下,它存储在store中,当我返回该组件时,它已为“true”,并立即重定向回上一页。可能确实需要等待内部操作创建者。当用户导航离开该页时,您可以将其标记为false
我想重新定向,或者在其他时候。哦,真的。不知怎么的,我想得太多了。谢谢!
export default (state = [], action) => {
switch (action.type) {
case 'CREATE_RECORDING_BEGIN':
return {
...state,
loading: true,
error: null,
finished: false
}
case 'CREATE_RECORDING_SUCCESS':
return {
data: action.payload,
loading: false,
finished: true
}
default:
return state;
}
}