如果一个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实例会被回收吗?

阅读 9.6k
2 个回答

说到pending内存溢出问题。

让我想到之前项目,由于数据量大,接口请求慢。用户一直频繁切换,导致接口一直pending状态,但其实已经没用的了。

后面处理方法就是,页面消毁前,把axios请求取消了就行。

vue页面消毁时,取消axios当面所有请求

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题