Javascript 在处理axios请求时防止用户刷新或退出

Javascript 在处理axios请求时防止用户刷新或退出,javascript,html,reactjs,axios,Javascript,Html,Reactjs,Axios,我正在开发一个使用Axios.get请求的Web应用程序。因为Axios是异步的,所以我正在执行异步函数和等待Axios。所有: async handleSubmit(){ const ops=[] for(i=0;i<this.state.rowsNumber;i++){ let op = axios.get(myrequest,{headers: {'Content-Type': 'text/xml'}

我正在开发一个使用Axios.get请求的Web应用程序。因为Axios是异步的,所以我正在执行异步函数和等待Axios。所有:

 async handleSubmit(){
            const ops=[]
            for(i=0;i<this.state.rowsNumber;i++){ 
                let op = axios.get(myrequest,{headers: {'Content-Type': 'text/xml'}} )
                        ops.push(op);
                }
            let res = await axios.all(ops);
}
async handleSubmit(){
常数运算=[]

对于(i=0;i),当用户单击刷新/关闭/离开浏览器时,可以使用window.onbeforeunload功能弹出确认窗口

window.addEventListener("beforeunload", function(event) { ... });

完成Axios后,只需删除侦听器。

当用户单击“刷新/关闭/离开浏览器”时,可以使用window.onbeforeunload功能弹出确认窗口

window.addEventListener("beforeunload", function(event) { ... });

完成Axios后,只需删除侦听器。

通过这种方式,您将获得
刷新
事件

if (window.performance) {
 if (performance.navigation.type == 1) {
   alert( "Reload page" );
 } else {
   alert( "Not reloaded");
 }
}

通过这种方式,您将获得
refresh
事件

if (window.performance) {
 if (performance.navigation.type == 1) {
   alert( "Reload page" );
 } else {
   alert( "Not reloaded");
 }
}

您可以利用
窗口。onbeforeunload
,虽然您不能完全阻止用户刷新,但您可以通知请求正在挂起:

 window.onbeforeunload = function() {
        return "A XHR request is pending, are you sure you want to leave ?";
    }
注意:

最近的web浏览器不会显示自定义消息,因为它是 被认为是一个安全问题


您可以利用
窗口。onbeforeunload
,虽然您不能完全阻止用户刷新,但您可以通知请求正在挂起:

 window.onbeforeunload = function() {
        return "A XHR request is pending, are you sure you want to leave ?";
    }
注意:

最近的web浏览器不会显示自定义消息,因为它是 被认为是一个安全问题



正如回答中所说的,没有可靠的方法来防止用户离开页面。你应该尝试以不依赖于客户端完成请求的方式设计你的应用程序。对于用户来说,阻止导航远离页面通常是更烦人的,而且我认为这样做是不好的UI实践。。事实上,挂起的请求失败可能还有许多其他原因,这些原因甚至不在您的控制范围之内。实际上,只要使用axios调用URL,它就会被执行,但为了用户体验,我想提醒他们是否在过程中重新加载,因为当过程结束时,数据的显示将被更新。如果他们重新引用sh因为他们不知道发生了什么,再次点击按钮,它可能会发送另一个请求并向我的后端发送垃圾邮件。我实现了一个加载栏,但我担心用户甚至不关心这个栏并在不等待它完成的情况下刷新。在我看来,这是几个不相关的问题,可以通过不同的方式解决。一个是如果应用程序执行的操作是编程错误,而用户执行的操作是限制或权限问题,则hing会向后端发送垃圾邮件。如果有数据更新进程正在运行或正在发生任何情况,则应禁用新渲染上的按钮,并不允许在服务器上执行该命令。这样可以防止用户偶然的“垃圾邮件”首先,你的后端。在后台计算繁重的任务也应该是异步的,而不是阻止一个响应。但是诚然,这些步骤需要相当多的工作,所以它可能是根据时间预算来提前的。只是想指出更好的解决方案。非常感谢你的答案,我会考虑它们因为我的AG。如果您同意,我的设计可能不适合这种情况!正如回答中所述,没有可靠的方法阻止用户离开页面。您应该尝试以一种不依赖客户端完成请求的方式设计应用程序。通常,阻止用户导航对用户来说是恼人而不是有用的事实上,一个挂起的请求失败的原因还有很多,甚至在你的控制之下也不多。事实上,一旦用AXIOS调用URL,它就被执行了,但是对于用户体验,我想提醒他们,如果他们在进程中重新加载,因为cess结束后,数据的显示将被更新。如果他们因为不知道发生了什么而刷新,然后再次单击按钮,它可能会发送另一个请求并向我的后端发送垃圾邮件。我实现了一个加载栏,但我担心用户甚至不关心此栏并在不等待完成的情况下刷新。在我看来,这些有几个不相关的问题可以用不同的方法解决。其中一个问题是,如果应用程序执行的是编程错误,而用户执行的是限制或权限问题,则滥发您的后端。您应该禁用新渲染上的按钮,如果有数据更新进程正在运行,则不允许在服务器上执行该命令或者任何正在发生的事情。这样可以防止用户意外地“垃圾邮件”首先,你的后端。在后台计算繁重的任务也应该是异步的,而不是阻止一个响应。但是诚然,这些步骤需要相当多的工作,所以它可能是根据时间预算来提前的。只是想指出更好的解决方案。非常感谢你的答案,我会考虑它们因为我的AG。请注意,我的设计可能不适合这种情况!嗨,我知道这个解决方案,但只有在axios请求正在处理时才能调用此函数吗?我想在请求开始时将布尔值设置为true,如果请求结束,则将其设置为false。因此,如果他刷新并且布尔值===true:通知用户。是吗有可能吗?谢谢,不要设置和取消设置bool标志,而是添加和删除侦听器以获得所需的结果谢谢你的回答,你如何继续添加或删除侦听器?使用window.removeListener,但你必须命名你的函数:嗨,我知道这个解决方案,但只有在axios请求时才能调用这个函数吗uest正在处理我想在请求开始时将布尔值设置为true,如果请求结束,则将其设置为false。因此,如果他刷新并且布尔值===true:通知用户。可能吗?谢谢你,不要设置和取消设置bool标志,而是添加和删除侦听器以获得所需的结果谢谢你的回答,如何