如何中断我的可观察对象的流程以使用RXJS调用另一个可观察对象?

时间:2019-01-18 12:34:31

标签: javascript angular rxjs rxjs5 rxjs6

我有可观察到的nex流:

verifyFacebookUser2(): Observable<User> {       
    let userFacebook = {"type": "facebook", "id_facebook": this.userId};
    return this._us.verifyRegisterFacebookObs(userFacebook )
      .flatMap(token => {
        if (!token) {
          return Observable.of([])
        }
        else {
          return Observable.fromPromise(this.storage.set('token', token));
        }
      }, error => {
        error => console.log("FIRST ERROR" + JSON.stringify(error));
      })
      .catch(err => {
        if (err.status === 404) {
          throw new Error("404");
        } else {
          throw new Error("");
        }
        //return Observable.of([])
      })
      .flatMap(res => {
        return Observable.fromPromise(this.storage.get('token'));
      })
      .flatMap(tokenStorage => {
        let decodedToken = this.jwtHelper.decodeToken(JSON.stringify(tokenStorage));
        let idUser = parseInt(decodedToken.id);
        return this._ups.getUserProfileObs(idUser);
      })
  }

如您所见,如果所有流程都正常,我的可观察返回用户,我的服务verifyRegisterFacebookObs返回一个用户:

verifyRegisterFacebookObs(user): Observable<any> {
    let url = URL_SERVICIOS + '/users/verify';
    return this.http2.post(url, user)
      .map(res => res['result'])
      /*.catch(error => {
         if (error.status === 404)
           return Observable.of("");
      })*/
  }

因此,当一切正常时,此流运行良好,但是如果我的服务返回404错误,我该如何执行另一个流或可观察的流。

如果我的服务返回404错误,则表示该用户不存在,我需要  注册此用户并调用新的http请求

使用我做下一个:

this.verifyFacebookUser2()
              .subscribe((user: User) => {
                alert("OK");               
              }, error => {
                alert(error);               
    // Can I call another function that call observable to do another flow ? 
                    this.registerIdFacebook(this.userId);    
                  })

如果一切正常,请打印ok,如果出现错误,我需要调用registerIdFacebook,因此,仅当this._us.verifyRegisterFacebookObs(userFacebook)及其404发出错误时,才调用registerIdFacebook。

 registerIdFacebook(id) {    
   this._us.facebookRegisterObs({"id_facebook": id}).
    subscribe(resultado => {
      alert(JSON.stringify(resultado));
    }, error => {
      //TODO PRESENT TOAST
      alert(JSON.stringify(error));
    })
  }

有人可以帮助我实现这一目标吗?

2 个答案:

答案 0 :(得分:0)

您可以使用catchError

您需要返回Observable,因此请直接致电_us服务:

this.verifyFacebookUser2() {
  .catchError(() => this._us.facebookRegisterObs({"id_facebook": id}))
  .subscribe((user: User) => {
    alert('OK');
}  

或更改您的registerIdFacebook以返回服务方法:

registerIdFacebook(id) {    
  return this._us.facebookRegisterObs({"id_facebook": id})
    .pipe(tap(
       (resultado) => {
         alert(JSON.stringify(resultado));
       }, 
       (error) => {
         //TODO PRESENT TOAST
         alert(JSON.stringify(error));
       }));
}


this.verifyFacebookUser2() {
  .catchError(() => this.registerIdFacebook(this.userId))
  .subscribe((user: User) => {
    alert('OK');
} 

答案 1 :(得分:0)

我已经解决了我的问题,这就是答案:

1。首先,如果错误状态为404,我的服务必须返回observable:

 verifyRegisterFacebookObs(user): Observable<any> {
    let url = URL_SERVICIOS + '/users/verify';
    return this.http2.post(url, user)
      .map(res => res['result'])
      .catch(error => {
         if (error.status === 404)
           return Observable.of("");
      })
  }
  1. 我修改了我的功能verifyFacebookUser

    verifyFacebookUser():可观察{         让userFacebook = {“ type”:“ facebook”,“ id_facebook”:this.userId};

        return this._us.verifyRegisterFacebookObs(userFacebook)
          .flatMap(token => {
            if (!token) {
              return this._us.facebookRegisterObs({"id_facebook": this.userId}).flatMap(user => {
                return Observable.fromPromise(this.storage.set('token', user.token));
              })
            }
            else {
              return Observable.fromPromise(this.storage.set('token', token));
            }
          }, error => {
            error => console.log("FIRST ERROR" + JSON.stringify(error));
          })
          .flatMap(res => {
            return Observable.fromPromise(this.storage.get('token'));
          })
          .flatMap(tokenStorage => {
            let decodedToken = this.jwtHelper.decodeToken(JSON.stringify(tokenStorage));
            let idUser = parseInt(decodedToken.id);
            return this._ups.getUserProfileObs(idUser);
          })
      }
    

如您所见,令牌是否不存在,我调用this._us.facebookRegisterObs,立即保存令牌以继续流程。

最后,我这样打电话:

 this.subscription=this.verifyFacebookUser()
          .subscribe((user: User) => {
            this.processDataObs(user);
            loading.dismissAll();
          }, error => {
            console.log("Error on flow ---" + error);
            loading.dismissAll();
            this.presentToast("Ups... ha ocurrido un error con facebook");
          })

不要忘记取消订阅:

 ionViewWillLeave() {
    if (this.subscription)
      this.subscription.unsubscribe();
  }