Как я могу прервать свой поток на моей наблюдаемой, чтобы вызвать другую наблюдаемую с RXJS? - PullRequest
0 голосов
/ 18 января 2019

У меня есть поток 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);    
                  })

Если все в порядке, напечатайте хорошо, если я получаю ошибку, мне нужно позвонить registerIdFacebook, поэтому я звоню в registerIdFacebook только тогда, когда ошибка генерируется this._us.verifyRegisterFacebookObs (userFacebook) и его 404.

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

Может ли кто-нибудь помочь мне достичь этого?

Ответы [ 2 ]

0 голосов
/ 21 января 2019

Я решил свой вопрос, и вот ответ:

1. Во-первых, мой сервис должен возвращать наблюдаемый, если статус ошибки 404:

 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 (): Observable { let 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();
  }
0 голосов
/ 18 января 2019

Вы можете использовать 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');
} 
...