簡體   English   中英

等待http.get()的響應

[英]Wait response for http.get()

我正在嘗試使用angular 2和ionic 2做一個登錄函數。此函數將驗證用戶是否通過php服務器在數據庫上被鎖住並返回用戶id。但是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()函數的按鈕時,會得到未定義的值作為響應。 第二次單擊時,它將返回上一個請求的值。

使用promise,調用服務的函數:

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; 
      });
  }

使用promise,我會在首次執行登錄功能時獲得id返回,但是我找不到任何方法來訪問__zone_symbol__value,該值是根據console.log() 控制台響應存儲對象的位置

我想知道是否有一種方法可以等待http.get()響應繼續執行程序(在使用observable的情況下),或者如何訪問promise所返回的對象

在調用服務的代碼中,您需要預訂可觀察對象,並在預訂內部的調用后執行任何您想發生的事情。

您也不要在此處設置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);
  });
}

這樣,當我第一次單擊觸發login()函數的按鈕時,會得到未定義的值作為響應。 第二次單擊時,它將返回上一個請求的值。

發生這種情況是因為您在執行console.log沒有等待訂閱完成。 第二次單擊時,它返回上一個請求的值,因為出於相同的原因,它不等待訂閱完成,因為console.log不在訂閱中,但是在第二次單擊時,第一個請求確實完成了。 因此,在第一個console.log之后設置了this.loginusuario

在函數中使用async並在調用promise中await

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

$ 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*/);
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM