Javascript 如果布尔值在任意点为真,且持续时间超过X秒
我正在使用Angular、Ionic和Firebase构建一个应用程序 在页面加载中,我将布尔值Javascript 如果布尔值在任意点为真,且持续时间超过X秒,javascript,angular,Javascript,Angular,我正在使用Angular、Ionic和Firebase构建一个应用程序 在页面加载中,我将布尔值isLoading设置为true,在应用程序内加载数据时,布尔值设置为false。这是非常可靠的,但有时,如果互联网速度慢/出现故障,isLoading永远不会设置为false,或者更确切地说,应该完成的功能不会设置为false 所以我的问题是,在应用程序处于活动状态的任何时候,我是否可以订阅或“检查”查看isLoading是否为true超过3秒 到目前为止,代码非常简单: 定义isLoadingbo
isLoading
设置为true
,在应用程序内加载数据时,布尔值设置为false
。这是非常可靠的,但有时,如果互联网速度慢/出现故障,isLoading
永远不会设置为false
,或者更确切地说,应该完成的功能不会设置为false
所以我的问题是,在应用程序处于活动状态的任何时候,我是否可以订阅或“检查”查看isLoading
是否为true
超过3秒
到目前为止,代码非常简单:
定义isLoading
bool:
isLoading: boolean = true;
调用firebase数据库:
ngOnInit() {
this.loadUser();
});
loadUser() {
this.database.database.ref('/users/'+this.user.uid).once('value', (snapshot) => {
this.isLoading = false;
});
});
如果isLoading
在任何时候都是true
并持续3秒以上,我该如何重新调用loadUser()
setTimeout(() => {
// Do a thing after three seconds
}, 3000);
尝试在布尔值上执行以下操作:
(isLoading) ? setTimeout(() => { // Do a thing after three seconds }, 3000) : null
你可以用
setTimeout(() => {
// Do a thing after three seconds
}, 3000);
尝试在布尔值上执行以下操作:
(isLoading) ? setTimeout(() => { // Do a thing after three seconds }, 3000) : null
您应该改用
AngularFire2
。这将使您能够更好地控制对数据库的操作,因为读、写和更新将返回AngularFireList
或AngularFireObject
基本上,这些将是可观察类型或承诺类型的值
如果是Promise
类型,您可以在catch
回调中将isLoading
设置为false
如果是
可观察的
类型,您可以重试可观察的
或在最后
回调中将isLoading设置为false
。您应该改用AngularFire2
。这将使您能够更好地控制对数据库的操作,因为读、写和更新将返回AngularFireList
或AngularFireObject
基本上,这些将是可观察类型或承诺类型的值
如果是Promise
类型,您可以在catch
回调中将isLoading
设置为false
如果是可观察
类型,您可以重试可观察
或在最终
回调中将isLoading设置为false
。您可能需要检查错误条件和设置间隔的组合。这样,您可以在等待时定期执行某些操作,并且可以处理来自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
您可能需要检查错误条件和设置间隔的组合。这样,您可以在等待时定期执行某些操作,并且可以处理来自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
我不这么认为,因为这只会运行一次,而带有if语句的setInterval在bool为true的3秒后实际上不会运行(isLoading)?setTimeout(()=>{//三秒后做一件事},3000):null`我喜欢@Siddharth建议的try-catch想法。我不这么认为,因为它只运行一次,而带有if语句的setInterval在bool为真的3秒后实际上不会运行。`(isLoading)?setTimeout(()=>{//三秒后做一件事},3000):null`我喜欢@Siddharth建议的“尝试捕捉”想法。这基本上就是我所说的@JaneDoe?回答不错,顺便说一句@rfestag,清晰间隔肯定是我没有考虑过的。这就是我所说的@JaneDoe?回答不错,顺便说一句@rfestag,清晰间隔肯定是我没有考虑过的。