Javascript 如果布尔值在任意点为真,且持续时间超过X秒

Javascript 如果布尔值在任意点为真,且持续时间超过X秒,javascript,angular,Javascript,Angular,我正在使用Angular、Ionic和Firebase构建一个应用程序 在页面加载中,我将布尔值isLoading设置为true,在应用程序内加载数据时,布尔值设置为false。这是非常可靠的,但有时,如果互联网速度慢/出现故障,isLoading永远不会设置为false,或者更确切地说,应该完成的功能不会设置为false 所以我的问题是,在应用程序处于活动状态的任何时候,我是否可以订阅或“检查”查看isLoading是否为true超过3秒 到目前为止,代码非常简单: 定义isLoadingbo

我正在使用Angular、Ionic和Firebase构建一个应用程序

在页面加载中,我将布尔值
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,清晰间隔肯定是我没有考虑过的。