Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angular/33.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
subscribe()使用rxJs在Angular 2中的两个不同组件中订阅相同的流_Angular_Rxjs - Fatal编程技术网

subscribe()使用rxJs在Angular 2中的两个不同组件中订阅相同的流

subscribe()使用rxJs在Angular 2中的两个不同组件中订阅相同的流,angular,rxjs,Angular,Rxjs,我正在尝试在一个Ionic 2 web应用程序中设置登录,我正在使用Observable 我有一个带有登录方法的auth模块,它连接到远程数据库以记录用户;如果登录成功,我希望将令牌(auth0)存储在localstorage中 这是在我的auth.service.ts中 login(user: any) { this.http .get(SERVER_URL, { user_data }, options) .map((response: Response) =

我正在尝试在一个Ionic 2 web应用程序中设置登录,我正在使用Observable

我有一个带有登录方法的auth模块,它连接到远程数据库以记录用户;如果登录成功,我希望将令牌(auth0)存储在localstorage中

这是在我的auth.service.ts中

login(user: any) {
    this.http
      .get(SERVER_URL, { user_data }, options)
      .map((response: Response) => response.json())
      .subscribe(
        data => this.authSuccess(data.jwt),
        err => this.handleError(err));
  }
因此,这本身就可以很好地发挥作用。现在我想使用登录屏幕,因此当用户提交数据时,如果登录成功,应用程序将导航到主屏幕,否则将显示错误消息

登录组件应该有如下内容

loginUser(event) {
    return this.authService
      .login(event.user)
      .subscribe(
        data => navigate_to_main,
        err => display_error_and_stay_in_login);
  }
因此,我需要在服务中订阅login方法,因为我只想在登录成功时存储令牌,但我还需要在LoginComponent中订阅loginUser方法,以便仅在登录成功时导航

这是怎么做到的?也许我做这件事的方式不对

有人能帮忙吗?
谢谢

您也可以通过在您的
auth.service.ts
中进行以下更改来执行此操作:

login(user: any) {
  return this.http
    .get(SERVER_URL, { user_data }, options)
    .map((response: Response) => {
      let data = response.json();
      this.authSuccess(data.jwt)
      return data;
    });
}

auth.service.ts可以返回可观察的,允许登录组件进行订阅:

login(user: any) {
    return this.http
      .get(SERVER_URL, { user_data }, options)
      .map((response: Response) => response.json())
      .do(
        data => this.authSuccess(data.jwt),
        err => this.handleError(err));
  }
如果需要从多个位置调用login,可以使用.cache避免重复请求:

private _login$;

loginOnce(user: any) {
    if (!this._login) {
        this._login = this.loginUser(user).cache();
    }
    return this._login;
}
来自组件的用法:

this.authService.login(user).subscribe(response => ...)

仅当您希望使用数据时订阅。您可以使用
catch
处理服务中的错误

您必须导入它
import'rxjs/add/operator/catch'

login(user: any) {
  return this.http
    .get(SERVER_URL, { user_data }, options)
    .map((response: Response) => {
      let data = response.json();
      this.authSuccess(data.jwt)
      return data;
    }).catch((err) => this.handleError(err) )
}

但是我错过了在AuthService中处理错误的机会,对吗?这是可行的,但是语义是错误的<代码>映射
用于映射可观察值,而不是用于产生副作用
do
在语义上适用于副作用。应该注意的是,您需要订阅才能使用数据。事实上,我最近注意到HTTP请求只有在有人订阅后才会执行。@Luftzig。对这对于任何可观察的对象都是正确的,而不仅仅是那些包含HTTP请求的对象。可观测值与函数类似。它们不会被执行,除非它们被调用,或者在可观察的情况下被“订阅”。