Angular 角度4 HttpClient可观测

Angular 角度4 HttpClient可观测,angular,Angular,我有一个Authenticate类,我想返回true或false,但对于Observable,它是异步的,因此我不知道如何等待httpclient完成 此时,对isLogin的调用将始终返回false import { Injectable } from '@angular/core'; import { HttpClient , HttpHeaderResponse, HttpHeaders, } from '@angular/common/http'; import { Observabl

我有一个Authenticate类,我想返回true或false,但对于Observable,它是异步的,因此我不知道如何等待httpclient完成

此时,对isLogin的调用将始终返回false

import { Injectable } from '@angular/core';
import { HttpClient , HttpHeaderResponse, HttpHeaders,  } from '@angular/common/http';
import { Observable } from 'rxjs/Observable';
import 'rxjs/add/operator/map';
import { Subscription } from 'rxjs/Subscription';

class LoginData {
    UserKey: string;
    Password: string;
}

class TokenData {
    token: string;
    datetime: string;
}

@Injectable()
export class Authenticate {

private Url  = 'http://192.168.1.1:6000';

    constructor(private http: HttpClient) {}

    public  isLogin(userkey: string, password: string ): boolean {
    const logindata = new LoginData();
        logindata.UserKey = userkey;
        logindata.Password = password;
    const retval = false;
     this.http.post<TokenData>(`${this.Url}/login`, logindata, {headers: this.getHeader()});
         .subscribe(sub => {
        if(sub.token)
        {
            localStorage.setItem('token',sub.token);
            retval = true;
        }
    } );
         return retval;
    }


}
从'@angular/core'导入{Injectable};
从'@angular/common/http'导入{HttpClient,HttpHeaderResponse,HttpHeaders,};
从“rxjs/Observable”导入{Observable};
导入'rxjs/add/operator/map';
从'rxjs/Subscription'导入{Subscription};
洛金达级酒店{
UserKey:string;
密码:字符串;
}
类标记数据{
令牌:字符串;
日期时间:字符串;
}
@可注射()
导出类验证{
专用Url=http://192.168.1.1:6000';
构造函数(私有http:HttpClient){}
public isLogin(userkey:string,password:string):布尔值{
const loginda=新loginda();
loginda.UserKey=UserKey;
loginda.Password=密码;
const retval=false;
this.http.post(`${this.Url}/login`,loginda,{headers:this.getHeader()});
.订阅(sub=>{
如果(子令牌)
{
localStorage.setItem('token',sub.token);
retval=true;
}
} );
返回返回;
}
}

在javascript中不可能以同步方式执行此操作。您必须在isLogin的调用者中更改代码。除了实现某种回调之外,没有其他方法。async和await关键字可能会有所帮助:

  • 将isLogin的签名更改为public async isLogin(userkey:string,password:string):Promise
  • 在isLogin的内部使用toPromise()。类似这样的.http.post(bla-bla.toPromise().then(tokenData=>{if(tokenData.token){return true;}else{return false;})
  • 将调用者的性质更改为async并使用await关键字:const isLogin:boolean=await component.isLogin('myname','mypwd')

sub
sub
你的回调返回是什么?我在app.component.ts上的订阅是这样的。auth.isLogin('smith','s12367')。订阅(s=>{localStorage.setItem('token',s.token);this.route.navigateByUrl('/mainpage');},err=>{console.log('Error:'+err);});我的意思是返回的数据是什么。@Z.Bagley,看起来你已经告诉我了。const retpromise=this.http.post(
${this.Url}/login
,loginda,{headers:this.getHeader()})。map(m=>{console.log('Got Token data');localStorage.setItem('Token',m.Token);return true;}).toPromise();return retpromise;可能重复的