加载动画在请求完成前就消失了怎么办?
我用 axios 发起请求时加了个 loading 动画,但有时候数据还没回来,loading 就提前隐藏了,特别奇怪。
我是这样控制 loading 状态的:this.loading = true,然后在 finally 里设成 false。但偶尔会闪一下就没了,是不是异步顺序出问题了?
getData() {
this.loading = true;
axios.get('/api/data')
.then(res => { this.list = res.data; })
.catch(err => { console.error(err); })
.finally(() => { this.loading = false; });
}
首先,你目前的代码逻辑看起来没问题,就是在请求开始时设置
this.loading为true,然后在请求完成后(无论是成功还是失败)都把this.loading设置为false。所以从逻辑上来说,loading 应该会在请求结束后才会消失。但是你说有时候会提前消失,可能是由于以下几个原因导致的:
1. 请求被取消或中断:虽然这种情况比较少见,但如果在请求过程中发生了错误或者请求被取消,可能会导致
finally块中的代码没有被执行。2. 多个请求并发问题:如果你的页面上有多个请求同时进行,可能会出现一个请求的
finally块过早地将this.loading设置为false,而其他请求还在进行中。3. 异步操作导致的状态不一致:有时候 JavaScript 的异步特性可能会导致一些难以预料的行为,尤其是当涉及到状态管理的时候。
为了确保 loading 动画不会在请求完成之前消失,我们可以采取以下措施:
1. 确保每个请求都有对应的 loading 管理:对于每个请求,都应该有自己的 loading 状态管理,而不是全局的一个
loading状态。这样可以避免多个请求并发时的状态冲突。2. 增加计数器来跟踪请求的数量:我们可以使用一个计数器来记录当前正在进行的请求数量。每次发起请求时计数器加一,每次请求结束时计数器减一。只有当计数器为零时,才将 loading 设置为
false。接下来,我们来实现这个计数器的方法:
这里需要注意的是,我们在每次发起请求时都检查
requestCounter的值来决定是否显示 loading。同样,在请求结束时,我们也会检查计数器的值来决定是否隐藏 loading。这样可以确保即使有多个请求同时进行,loading 动画也能正确地显示和隐藏。希望这能解决你遇到的问题。如果还有其他问题,随时可以问我。