如果一个promise对象永远pending会有什么后果?
如果一个promise对象一直不被resolve或reject,在其then上注册回调就一直不会被调用,该回调产生的闭包是否会一直留在内存中,不会被回收,从而导致内存泄漏?
使用场景如下:
// request.js
// 请重点关注axios请求出错的拦截器
import axios from 'axios'
const request = axios.create()
request.interceptors.response
.use(
response => response.data,
error => {
if (error.response.status === 401) {
// 该promise对象一直处于pending
window.alert('登录信息失效!')
return new Promise(() => {})
}
}
)
export default request
// Userinfo.vue
<script>
import request from '../request.js'
export default {
data() {
return {
loading: false,
users: []
}
},
methods: {
getUserList(id) {
this.loading = true
return request.get('/users')
.then(res => {
this.loading = false
this.users = res
})
.catch(e => {
this.loading = false
this.$notify.error(e.message)
})
}
}
}
</script>
说明:拦截器拦截到401的错误后,返回了一个promise对象,该promise实例化时传入的回调既不会调用reject,也不会调用resolve,是永远处于pending状态的。
之所以不resolve或reject是不想走axios调用者的catch,防止重复多余的提示(拦截器里一次,catch里一次)。
请问这样的写法,then和catch由于有vue实例的闭包引用,在页面被销毁之后,vue实例会被回收吗?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
https://www.zhihu.com/questio...
说到pending内存溢出问题。
让我想到之前项目,由于数据量大,接口请求慢。用户一直频繁切换,导致接口一直pending状态,但其实已经没用的了。
后面处理方法就是,页面消毁前,把axios请求取消了就行。
《vue页面消毁时,取消axios当面所有请求》