如果布尔值在任何时间超过X秒为真,

时间:2018-09-01 20:32:15

标签: javascript angular

我正在使用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

3 个答案:

答案 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。这将使您更好地控制对数据库的操作,因为读,写和更新将返回AngularFireListAngularFireObject

基本上,这些值将是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