如果一个promise对象永远pending会有什么后果?

发布于 2022-09-12 04:40:10 字数 1407 浏览 23 评论 0

如果一个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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

傻比既视感 2022-09-19 04:40:10

说到pending内存溢出问题。

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

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

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

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文