Angular 调用内部有订阅的可观察对象

Angular 调用内部有订阅的可观察对象,angular,observable,subscribe,ecmascript-2016,Angular,Observable,Subscribe,Ecmascript 2016,我仍然有一些关于可观察对象和订阅者的问题,我所面临的是如果我从我没有获得数据的组件调用下面的可观察方法。它是未定义的: login(username: string, password: string): Observable<any> { const body = { 'Mobile': username, 'Password': password, }; return this

我仍然有一些关于可观察对象和订阅者的问题,我所面临的是如果我从我没有获得数据的组件调用下面的可观察方法。它是未定义的:

login(username: string, password: string): Observable<any> {
       const body =  {
            'Mobile': username,
            'Password': password,
            };
        return this.http.post(`${this.baseURL + this.loginApiRoot}/Login`, body)
            .pipe(map((response: Response) => {
                const jobj = JSON.parse(response.text());
                const loginrequest = jobj['lr'];
                const token = loginrequest['token'];
                const is2auth = loginrequest['authtype'];
                const schoolcode: string[] = jobj['schoolcode'];
                // login successful if there's a jwt token in the response
                if (token && token !== 'Invalid Login' ) {
                    if (token === 'Oops! seems you have not confirmed your email') {
                      return {result: false, message: token};
                    }
                    this.getUserRole(token).subscribe(userRole => {
                      this.userRole = userRole[0];
                      if (this.userRole === 'school' || this.userRole === 'admin') {
                        this.LoginSuccess(token, username, is2auth);
                        // return {result: true, message: token};
                      } else {
                        this.LoginFailed(token, username, is2auth);
                        // return {result: false, message: token};
                      }
                    });
                } else {
                    // return false to indicate failed login
                    this.LoginFailed(token, username, is2auth);
                    return {result: false, message: token};
                }
            }));
    }
并且这个console.log正在返回未定义的数据

来自另一个项目的代码工作正常:

login(username: string, password: string): Observable<any> {        
       var body =  {
            "Email":username,
            "Password":password,
            }          
        return this.http.post(`${this.loginApiRoot}/Login`, body)
            .map((response: Response) => {
                let jobj = JSON.parse(response.text());
                let token = jobj["token"];
                let is2auth=jobj["authtype"];
                // login successful if there's a jwt token in the response
                if (token && token!="Invalid Login" ) {
                    if (token =="Oops! seems you have not confirmed your email"){
                        return {result:false,message:token};
                    }
                    this.token = token;
                    this.isValidUser = true
                    this.userEmail = username;
                    this.setToken(username, token)
                    this.authType=is2auth;
                    if (is2auth==1)
                    {   
                        this.isLogin=true;
                        this.is2Auth=true;
                        this.router.navigate(['/markets']);
                        return {result:true,message:token};
                    }
                    else if (is2auth>1)
                    {
                       this.isLogin = true;
                       this.is2Auth=false;
                       this.router.navigate(['/verify2auth']);
                       return {result:false,message:token};
                    }
                    else
                    {
                    }
                }

                else {
                    // return false to indicate failed login
                    return {result:false,message:token};
                }
            });
    }
login(用户名:string,密码:string):可观察{
变量体={
“电子邮件”:用户名,
“密码”:密码,
}          
返回this.http.post(`${this.loginApiRoot}/Login`,body)
.map((响应:响应)=>{
让jobj=JSON.parse(response.text());
let token=jobj[“token”];
设is2auth=jobj[“authtype”];
//如果响应中有jwt令牌,则登录成功
if(令牌和令牌!=“无效登录”){
if(token==“哎呀!您似乎还没有确认您的电子邮件”){
返回{result:false,message:token};
}
this.token=token;
this.isValidUser=true
this.userEmail=用户名;
this.setToken(用户名、令牌)
this.authType=is2auth;
if(is2auth==1)
{   
this.isLogin=true;
this.is2Auth=true;
this.router.navigate(['/markets']);
返回{result:true,message:token};
}
否则如果(is2auth>1)
{
this.isLogin=true;
this.is2Auth=false;
this.router.navigate(['/verify2auth']);
返回{result:false,message:token};
}
其他的
{
}
}
否则{
//返回false表示登录失败
返回{result:false,message:token};
}
});
}

您应该在组件中而不是在服务中进行所有验证,只需从服务中返回可观察内容并在订阅中进行验证

 return this.http.post(`${this.baseURL + this.loginApiRoot}/Login`, body)
 .pipe(map((response: Response) => {
    return response;
}));
在成分上,

this.authenticationService.login(this.model.username, this.model.password)
    .subscribe(data => {
    let result = data;
     // do all your validations here
}

此外,您在第一次调用get UserRole时使用了另一个http get方法,在从第一次调用中获得ReusElt后,您应该将其作为一个函数进行分离。

您应该在组件中而不是在服务中进行所有验证,只需从服务中返回可观测值并在subscribe中进行验证

 return this.http.post(`${this.baseURL + this.loginApiRoot}/Login`, body)
 .pipe(map((response: Response) => {
    return response;
}));
在成分上,

this.authenticationService.login(this.model.username, this.model.password)
    .subscribe(data => {
    let result = data;
     // do all your validations here
}

另外,您在第一次调用get UserRole的内部创建了另一个http get方法,在从第一次调用中获得reuslt后,您应该将其作为一个函数进行分离。

您需要根据您的要求在这一行返回一些内容

if (this.userRole === 'school' || this.userRole === 'admin') {
                        this.LoginSuccess(token, username, is2auth);
                        // return {result: true, message: token};
                      } else {
                        this.LoginFailed(token, username, is2auth);
                        // return {result: false, message: token};
                      }

您需要根据您在这一行的要求返回一些东西

if (this.userRole === 'school' || this.userRole === 'admin') {
                        this.LoginSuccess(token, username, is2auth);
                        // return {result: true, message: token};
                      } else {
                        this.LoginFailed(token, username, is2auth);
                        // return {result: false, message: token};
                      }

好吧,为什么不推荐我这边的方法呢。我没有读过任何文档。我只是把手弄脏了。你返回的是一个对象,而不是你无法订阅的可观察对象ok,那么如果我以任何方式返回可观察对象,那有可能吗?我不是在争论,而是在试图理解,请看我编辑的问题,另一个项目中的代码正在为我工作。你在吗?好的,为什么不推荐我这边的方法。我没有读过任何文档。我只是把手弄脏了。你返回的是一个对象,而不是你无法订阅的可观察对象。好吧,那么如果我以任何方式返回可观察对象,那有可能吗?我不是在争论,而是在试图理解,请看我编辑的问题,另一个项目中的代码正在为我工作。你在吗?