【问题标题】:RxJs Observable How to Handle SuccessRxJs Observable 如何处理成功
【发布时间】:2020-02-05 16:04:33
【问题描述】:

有没有办法在 Angular 服务中而不是在 Angular 组件中(通过订阅)处理 RxJs POST 或 GET(或所有 CRUD 操作)的成功?

我想设置一个 BehaviorSubject 来发出用户已成功登录的信息。我正在考虑通过我的 BehaviorSubject (this.loggedIn.next(true)) 与各种同级组件分享成功结果,因为这些同级组件需要进行更改基于单个服务userLogin() 调用。

这是我的 AuthenticationService 中的 userLogin 方法和 BehaviorSubject:

private loggedIn = new BehaviorSubject<boolean>(false);

userLogin(user): Observable<any> {
return this.http
  .post(this.apiUrl, user, httpOptions)
  .pipe(catchError(this.handleError));
}

这是我想要的 AuthenticationService 的伪代码:

private loggedIn = new BehaviorSubject<boolean>(false);

userLogin(user): Observable<any> {
return this.http
  .post(this.apiUrl, user, httpOptions),
  this.loggedIn.next(true),            <<--------
  .pipe(catchError(this.handleError));
}

提前谢谢你!

【问题讨论】:

  • 只需在服务中移动subscribe 吗?我不明白你的问题的重点,当然你可以这样做......
  • 我也在订阅我的组件服务调用。可以吗?
  • 嗯,不,你要求不要那样做......
  • 因此我问是否有办法像处理catchError一样处理成功?
  • 是的,将订阅移动到服务中,并使用.next向您的行为主体发送数据!

标签: angular rxjs observable


【解决方案1】:

你可以试试:

private loggedIn = new BehaviorSubject<boolean>(false);

userLogin(user): Observable<any> {
return this.http
  .post(this.apiUrl, user, httpOptions)
  .pipe(map((res: any) => {
                this.loggedIn.next(true)
                return res;
        }), catchError(this.handleError));
}

【讨论】:

  • 如果组件删除了subscribe,这将不起作用
  • @Maryannah 感谢您的建议。我将确保在我的所有组件中使用订阅
  • @onmyway 或者您可以将其放入服务以避免重复(请确保不返回任何内容并从您的组件中删除订阅)
【解决方案2】:

订阅后处理

    ngOnInit() {
            this.loading.present();
            this.yourService.getUsers().
                subscribe(data => {
                    console.log(this.data);
                },
               //Errr----->***      
              err =>{ console.log('HTTP Error', err),this.loading.dismiss()}
            );
        }

在服务中可以处理

https://scotch.io/bar-talk/error-handling-with-angular-6-tips-and-best-practices192

 handleError(error) {
    ///your error
       let errorMes = '';
       if (error.error instanceof ErrorEvent) {
         // client-side error
         errorMes = `Error: ${error.error.message}`;
       } else {
         // server-side error
         errorMes = `Error Code: ${error.status}\nMessage: 
         ${error.message}`;
       }
       window.alert(errorMes);
       return throwError(errorMes);
     }

【讨论】:

  • Tx 用于响应,但我想在服务而不是组件中处理它
  • 等我改一下
  • 嘿轨道。谢谢您的帮助。我正在尝试在我的服务中处理成功。 ;)
猜你喜欢
  • 2020-03-26
  • 1970-01-01
  • 1970-01-01
  • 2016-03-09
  • 2023-03-08
  • 1970-01-01
  • 2018-01-18
  • 2021-11-02
  • 2020-10-06
相关资源
最近更新 更多