Объявите переменную и сохраните извлеченные данные внутри - PullRequest
0 голосов
/ 10 мая 2018

Мне удалось получить данные из Firebase, однако я не могу сохранить данные в объявленной мной переменной. Я хочу сохранить в переменной, чтобы я мог использовать другой метод.

Пожалуйста, помогите.

Это коды, которые я пробовал.

1-й метод, остальные API

retrieveUser(){
this.restProvider.retrieveUser(this.emailAdd, this.pw)
.subscribe(listUser => {
this.users = userList.results //trying to store to users variable
console.log(listUser);
},
err => {
console.log(err);
},
() => console.log('success')
);}

2-й метод, используемый для некоторых IF-ELSE

loginBtnPress(event){
this.retrieveUser();
console.log(this.users);
}

1 Ответ

0 голосов
/ 10 мая 2018

Вы делаете это неправильно. this.users обновляется с помощью observables. Таким образом, если вы попытаетесь получить его значение до его обновления, вы не получите его, как ожидалось. Вы можете назвать это, как показано ниже,

retrieveUser(){
this.restProvider.retrieveUser(this.emailAdd, this.pw)
.subscribe(listUser => {
   this.users = userList.results //trying to store to users variable
   callYourMethodWithUpdatedValue(this.users); // <-- Pass value here
   },
   err => {
   console.log(err);
  },
  () => console.log('success')
  );}

callYourMethodWithUpdatedValue вызывается каждый раз (и как только) значение this.users обновляется

Обновление 1

Вы не можете получить асинхронное значение одним методом и ожидать, что это значение будет использоваться другим методом при нажатии кнопки. Причина в том, что вы ожидаете значение при нажатии этой кнопки, но, поскольку он является вызовом async (может занять n сек), вы не можете быть уверены, что значение будет заполнено, когда значение будет использовано при некотором вызове кнопки ,

Это неправильная реализация. Вам нужно изменить архитектуру на одну из следующих:

  1. Не направлять на эту страницу, если значение user не было разрешено (получено). Проверьте canActivate и canActivateChildren.

  2. Измените UX, в котором вы пытаетесь получить переменную использования async при нажатии кнопки, и активируйте кнопку после получения значения (Здесь вы можете использовать Subject). Примерно так:

...