Ожидание ответа для http.get () - PullRequest
0 голосов
/ 23 мая 2018

Я пытаюсь сделать функцию входа в систему с использованием angular и ionic 2. Эта функция проверяет, находится ли пользователь в кадастре в базе данных через php-сервер, и возвращает идентификатор пользователя. Но http.get () работает в асинхронном режиме.форма, поэтому я не могу сравнить, если пользователь существует в базе данных, потому что возвращение функции не определено.Я попробовал два способа, используя наблюдаемые и обещания:

С наблюдаемой функцией, вызывающей службу:

login() 
  {
    this.usuario = this.loginservice.get_usuario(this.loginusuario).subscribe(response =>this.usuario = response);
    console.log(this.usuario);
  }

Сервисный код:

public get_usuario(usuario):Observable<any>
  {
      return this.http.get(this.urlusuario +"/"+ usuario.usuario +"/"+ 
   usuario.senha); 
  }

Таким образом, при первом нажатии кнопки, которая вызывает функцию login (), в ответ я получаю неопределенное значение.Второй раз, когда я нажимаю, он возвращает значение предыдущего запроса.

Используя обещание, функция, которая вызывает службу:

login() 
  {
    this.usuario = this.loginservice.get_usuario(this.loginusuario);
    console.log(this.usuario);
  }

код услуги:

public get_usuario(usuario):Promise<any>
  {
    var resultado;
      return this.http.get(this.urlusuario +"/"+ usuario.usuario +"/"+ usuario.senha).toPromise().then(function(data){
         return  data; 
      });
  }

Используя обещание, я получаю возвращаемое значение идентификатора при первом выполнении функции входа в систему, однако я не смог найти какой-либо способ доступа к значению __zone_symbol__, где хранится объект в соответствии сconsole.log() консольный ответ

Я хочу знать, есть ли способ ожидания ответа http.get () для продолжения выполнения программы (в случае использования наблюдаемого) или как это сделатьЯ получаю доступ к объекту, который возвращается из обещания

Ответы [ 3 ]

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

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

Вы также не устанавливаете this.usuario = this.loginservice.get_usuario... здесь.Вы устанавливаете this.usario равным Observable, а не ответом Observable.

login() 
{
  this.loginservice.get_usuario(this.loginusuario).subscribe(response => {
    this.usuario = response;
    console.log(this.usuario);
  });
}

Таким образом, при первом нажатии кнопки, которая вызывает вход в систему (), я получаю неопределенное значение в ответ.Второй раз, когда я нажимаю, он возвращает значение предыдущего запроса.

Это происходит потому, что вы делаете console.log, не дожидаясь окончания подписки.При втором щелчке он возвращает значение предыдущего запроса, потому что по той же причине он не ожидает завершения подписки, поскольку console.log отсутствует в подписке, а к тому времени, когда вы щелкаете по нему второй раз,Первый запрос закончился.Поэтому this.loginusuario был установлен ПОСЛЕ первого console.log.

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

Используйте async в функции и await в обещании вызова

async login() 
  {
    await this.usuario = this.loginservice.get_usuario(this.loginusuario);
    console.log(this.usuario);
  }
0 голосов
/ 23 мая 2018

$ http.get функции возвращают Promise, потому что метод .get () отправляет асинхронный ajax-запрос.Чтобы написать ответ на вашу переменную, вам нужно сделать следующее:

login () {
    var self = this;
    this.http.get('/url/').then(response => {
        self.usuario = response;
        // It will write response from server to your variable when the 
        // request will be done
    }).catch(error => /*Your error handler*/);
}
...