vue页面回退或关闭,发送请求不中断问题
vue页面回退或关闭,发送请求不中断
最近做项目有个需求
video 播放视频中,点击浏览器 回退 按钮 调用接口 统计观看时长。
就是这个看似简单的事,折腾我两天,最后终于搞定。
首先 vue 在回退或关闭页面之前调用某个方法
mounted() {
window.addEventListener('beforeunload', e => this.pause(e))
},
destroyed() {
window.removeEventListener('beforeunload', e => this.pause(e))
}
mounted组件挂载生命周期 让window监听beforeunload事件,并给对应方法。destroyed销毁生命周期 让window去除监听beforeunload事件。
在 pause 方法中,要调用接口统计视频观看时长。
这时候问题出现了
在浏览器回退(或关闭)后,axios 调用接口时被中断,没调用成功。
搜索问题发现需要同步调用接口。后来用 async await 调用 axios 。
甚至用原生 XMLHttpRequest 对象同步调用接口,均以失败告终。
原来 Chrome 浏览器不允许页面关闭期间进行同步调用XMLHTTPRequest() 方法,这条规则适用于 beforeunload、unload、pagehide 和 visibilitychange 这些 API。
为了保证页面在卸载时可以成功调用接口请求数据,官方建议使用 sendBeacon() 或者 Fetch keep-alive 。
以 Fetch keep-alive 为例:
pause() {
let url = process.env.VUE_APP_BASE_URL + '/api/setData';
let data = {
...params // 一些参数
}
// fetch 调用接口
fetch( url, {
method: 'POST',
headers:{
'Accept': 'application/json',
'Content-Type': 'application/x-www-form-urlencoded',
'Authorization': 'Bearer ' + getToken() // getToken 返回 token
},
body: qs.stringify(data),
keepalive: true
});
}
fetch方法不需要安装依赖,vue中直接使用- 将
keepalive设置为true就可确保浏览器关闭或回退,调用接口的链接不会被关闭,调用成功。
总结
相关文章
Element UI 上传组件实现文件上传并附带额外参数功能
在使用 ElementUI 的上传组件 el-upload 实现文件上传功能时,如果单文件上传是比较简单的,但是在实际需求中,往往会在上传文件时伴随着一些其他参数,怎么操作呢,下面通过示例代码讲解感兴趣的朋友一起看看吧2023-08-08
ElementUI select弹窗在特定场合错位问题解决方案
这篇文章主要介绍了ElementUI select弹窗在特定场合错位问题解决方案,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧2024-01-01
Vue3 setup语法糖销毁一个或多个定时器(setTimeout/setInterval)
这篇文章主要给大家介绍了关于Vue3 setup语法糖销毁一个或多个定时器(setTimeout/setInterval)的相关资料,vue是单页面应用,路由切换后,定时器并不会自动关闭,需要手动清除,当页面被销毁时,清除定时器即可,需要的朋友可以参考下2023-10-10


最新评论