Javascript 在操作创建者完成之前路由更改

Javascript 在操作创建者完成之前路由更改,javascript,ajax,reactjs,redux,react-router,Javascript,Ajax,Reactjs,Redux,React Router,在我的react redux应用程序中,我有一个action creator,它进行4个服务器调用,前三个调用是异步的,然后最后一个调用等待第三个调用的响应 让我们假设有人在第三次响应到来之前改变了路线,第四次呼叫将不会发出。我如何确保这不会发生 或者,在actioncreator完成其工作之前,我不应该允许路由更改(用户不会喜欢这样)。或者,我应该允许第四次呼叫发生,即使路线改变,从用户的角度来看,这是一个合理的解决方案。我不知道如何编码任何解决方案,请发表意见 注意:可以从顶部的导航栏更改路

在我的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);
  }
}