Javascript 在操作创建者完成之前路由更改
在我的react redux应用程序中,我有一个action creator,它进行4个服务器调用,前三个调用是异步的,然后最后一个调用等待第三个调用的响应 让我们假设有人在第三次响应到来之前改变了路线,第四次呼叫将不会发出。我如何确保这不会发生 或者,在actioncreator完成其工作之前,我不应该允许路由更改(用户不会喜欢这样)。或者,我应该允许第四次呼叫发生,即使路线改变,从用户的角度来看,这是一个合理的解决方案。我不知道如何编码任何解决方案,请发表意见Javascript 在操作创建者完成之前路由更改,javascript,ajax,reactjs,redux,react-router,Javascript,Ajax,Reactjs,Redux,React Router,在我的react redux应用程序中,我有一个action creator,它进行4个服务器调用,前三个调用是异步的,然后最后一个调用等待第三个调用的响应 让我们假设有人在第三次响应到来之前改变了路线,第四次呼叫将不会发出。我如何确保这不会发生 或者,在actioncreator完成其工作之前,我不应该允许路由更改(用户不会喜欢这样)。或者,我应该允许第四次呼叫发生,即使路线改变,从用户的角度来看,这是一个合理的解决方案。我不知道如何编码任何解决方案,请发表意见 注意:可以从顶部的导航栏更改路
注意:可以从顶部的导航栏更改路线。您可以选择以下选项之一:
- React路由器(v4)支持
- 默认情况下,完整的客户端React应用程序将进行后台计算(称为应用程序状态)
您还可以使用从API预取数据。方法1- 如果要在API调用运行时向用户显示不可拒绝的覆盖,可以这样做-
//You can pass a prop like isShown to toggle the visibility, Here Modal component is used from **react-bootstrap** library
//backdrop and keyboard false prop means it's non dismissible
<Modal className="loader" show={this.props.isShown} backdrop={false} keyboard={false}>
<Modal.Body className="text-center">
<div><img className="loader-image" src="https://d1ykm90fp7q29d.cloudfront.net/assets/images/misc/loader.gif"/>
</div>
<br/>
<h2> Loader text </h2>
</Modal.Body>
</Modal>
您是否使用thunk/saga等库进行服务器调用?如果没有,我建议您看看redux saga,因为它可以简化异步调用,并且您的案例可以使用saga effects轻松解决。(虽然最初的学习曲线会有点困难)。我已经使用了saga,但我不知道saga的效果。我不确定我是否正确理解了你的问题。您想知道并行执行3个调用和等待第3个调用完成的第4个调用的代码吗?或者,您想知道如何在呼叫运行时阻止用户更改路由?(这可以通过在api调用运行时向用户显示进度对话框轻松避免)我想知道如何在调用运行时阻止用户更改路由
函数doSomething{dispatch(a());dispatch(B());dispatch(C());dispatch(D());}
React路由器(v4)支持防止转换,它只会阻止不执行。完整的客户端React应用程序默认情况下会进行后台计算(称为应用程序状态)。我不知道你这是什么意思。当你在路由之间切换(使用React路由器)时,你仍然拥有持久存储。这意味着,React路由器只需在导航中更改呈现的DOM和路径,而不是刷新整个应用程序。所以,如果您启动Ajax调用,它将在后台进行抓取,直到guest刷新您的应用程序。如果第四次呼叫尚未开始,正在等待3d完成,并且我更改了路线,则不会进行第四次呼叫。我将检查此传奇解决方案。好的。这里的“呼叫”和“全部”是传奇效果。你可以在官方文件中阅读更多关于它们的信息。
//Main saga
function* mainSaga(params){
const [result1, result2, result3] = yield all([
call(apiCall1, params1), //function apiCall1 should call your Api1
call(apiCall2, params2),
call(apiCall3And4, params3And4) //apiCall3And4 is another saga which is implemented below
])
}
//apiCall3And4 saga
function* apiCall3And4(params){
const call3result = yield call(apiCall3, params3);
if(call3Result != null){
//call api 4
yield call(apiCall4, params4);
}
}