我正在使用Angular,Ionic和Firebase构建应用程序。
在页面加载中,我将布尔isLoading
设置为true
,并且在应用程序中加载数据时,布尔值设置为false
。这已经相当可靠了,但是有时候,如果互联网运行缓慢/失败,则isLoading
永远不会设置为false
,或者说应该完成的功能却不会。
所以我的问题是,在应用处于活动状态时,我是否可以进行某种订阅或“检查”以查看isLoading
是否为true
超过3秒?
到目前为止,代码非常简单:
定义isLoading
布尔值:
isLoading: boolean = true;
调用firebase数据库:
ngOnInit() {
this.loadUser();
});
loadUser() {
this.database.database.ref('/users/'+this.user.uid).once('value', (snapshot) => {
this.isLoading = false;
});
});
是否有任何想法在loadUser()
为isLoading
超过3秒的时间内重新调用true
?
答案 0 :(得分:4)
您可能希望结合检查错误条件和setInterval。这样,您可以在等待时定期执行某些操作,并且可以处理来自Firebase的错误
loadUser() {
let interval = setInterval(() => {
if (this.isLoading) {
//You are still waiting
}
}, 3000)
this.database.database.ref('/users/'+this.user.uid).once('value', (snapshot) => {
this.isLoading = false;
clearInterval(interval);
},
(error) => {
//Handle error case
clearInterval(interval);
});
};
我对firebase不太熟悉,但是您可能需要在ref
调用中执行类似的失败回调,以防错误在那里并且不处理once
>
答案 1 :(得分:1)
您应该改用AngularFire2
。这将使您更好地控制对数据库的操作,因为读,写和更新将返回AngularFireList
或AngularFireObject
。
基本上,这些值将是Observable类型或Promise类型的值。
如果它是Promise
类型,则可以重试或在isLoading
回调中将false
设置为catch
。
如果它是Observable
类型,则可以retry
Observable
或在isLoading
回调中将false
设置为finally
。
答案 2 :(得分:0)
您可以使用
setTimeout(() => {
// Do a thing after three seconds
}, 3000);
尝试对布尔值执行此操作:
(isLoading) ? setTimeout(() => { // Do a thing after three seconds }, 3000) : null