Функции Angular 6, которые потребляют Observable из HTTP, возвращают GET перед построением данных - PullRequest
0 голосов
/ 03 октября 2018

Я пытаюсь прочитать данные с конечной точки REST.После прочтения данных и я хочу построить список экземпляров и вернуть список.

Но поскольку функция HTTP GET возвращает метод Observable, всегда возвращается и очищается список перед построением его из ответа.

Вот мой код:

 public getUsers() {
    let responseValue = this.http.get(this.utils.provideserviceURL('http://test.com/users'));

    responseValue.toPromise()
    .then(result => {
      let usersList: User[] = [];
      let jsonResult = result.json();
      for (let temp of jsonResult) {
        let tempUser = new User(jsonResult.id, jsonResult.username, jsonResult.password, jsonResult.firstName, jsonResult.lastName);
        usersList.push(tempUser);
      }
      console.log(usersList);
      return usersList;
    })
    .catch(err => {
      // Error while fetching Users
      console.log('Error');
    });

  }

Здесь функция возвращает undefined и затем печатает консоль с правильными данными.

Я не полностью осведомлен о правильном способе использования toPromise().Пожалуйста, укажите мне на пост, если он уже обсуждался, и сделайте этот вопрос дубликатом.

Ответы [ 2 ]

0 голосов
/ 04 октября 2018

Вот как я это делаю (я видел, что обесценивается),

constructor(private dataservice: DataService){}

myEmail: string = '';
myID: number = 0;

ngOnInit(){
this.dataservice.getMe()
.subscribe((data: WhoAmI) => {
  this.myEmail = data.Contacts.find(x=>x.ContactTypeName == "Email").ContactValue;
  this.myID = data.ID;
});
0 голосов
/ 04 октября 2018

Это потому, что в JavaScript не дожидается ответа.Не имеет смысла возвращать что-то в поведении после ответа

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

public users: Users = undefined

public getUsers() {
    let responseValue = this.http.get(this.utils.provideserviceURL('http://test.com/users'));

    responseValue.toPromise()
    .then(result => {
      let usersList: User[] = [];
      let jsonResult = result.json();
      for (let temp of jsonResult) {
        let tempUser = new User(jsonResult.id, jsonResult.username, jsonResult.password, jsonResult.firstName, jsonResult.lastName);
        usersList.push(tempUser);
      }
      console.log(usersList);
      this.users = usersList;
    })
    .catch(err => {
      // Error while fetching Users
      console.log('Error');
    });

  }
...