Если логическое значение истинно в любой точке дольше, чем X секунд - PullRequest
0 голосов
/ 01 сентября 2018

Я создаю приложение, используя Angular, Ionic и Firebase.

На странице загрузки я устанавливаю логическое значение isLoading на true, а при загрузке данных в приложении bool устанавливается на false. Это было довольно надежно, но иногда, если интернет работает медленно / не удается, isLoading никогда не устанавливается на 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;
  });
});

Есть идеи, как мне перезвонить loadUser(), если isLoading равно true в любой точке в течение более 3 секунд?

Ответы [ 3 ]

0 голосов
/ 01 сентября 2018

Вы должны использовать вместо AngularFire2. Это даст вам лучший контроль над вашими операциями с базой данных, поскольку операции чтения, записи и обновления будут возвращать либо AngularFireList, либо AngularFireObject.

По сути, это будут значения типа Observable или Promise.

Если это тип Promise, вы можете повторить попытку или установить isLoading на false в обратном вызове catch.

Если это тип Observable, вы можете retry Observable или установить isLoading на false в finally обратном вызове.

0 голосов
/ 01 сентября 2018

Возможно, вам нужна комбинация проверки условий ошибки и 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

0 голосов
/ 01 сентября 2018

вы можете использовать

setTimeout(() => {
    // Do a thing after three seconds
}, 3000);

Попробуйте это сделать на логическом:

(isLoading) ? setTimeout(() => { // Do a thing after three seconds }, 3000) : null 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...