2017-11-23 2 views
2

Ich möchte Kette zwei beobachtbar in Angular, wo der Ausgang der ersten Observable in der zweiten beobachtbaren Funktion als Parameter benötigt wird.Wie zwei Observablen in angular2 zu ketten, wenn der Wert der ersten beobachtbaren Notwendigkeit in der zweiten

Ich habe eine beobachtbare wie folgt erstellt:

storeData(response: any): Observable<any> { 
    return Observable.create((observer) => { 
    // storing the data in localstorage 
    this.storage.ready().then(() => { 
     this.storage.set('USERACCESSTOKEN', response.token).then(() => { 
     this.storage.set('USERROLE', response.user_role).then(() => { 
      delete response.token; 
      this.storage.set('USERDATA', response).then(() => { 
      this.setLoggedIn(true); 
      observer.complete(); 
      }) 
     }) 
     }) 
    }) 
    }); 
} 

ich in meinem Login-Seite wie diese verwenden möchten:

login(form: any, event: Event): void { 
    this.authService.otpVerify(form) 
    .switchMap((data) => this.authService.storeData(data)) 
    .subscribe(response => { 
     if(this.navCntrl.canGoBack()) 
      this.navCntrl.pop(); 
     else 
      this.navCntrl.setRoot('TabsPage'); 
    }, (err)=>{ 
      console.log("your credentials doesn't match"); 
    }); 
} 

hier aus otpVerify, werde ich Antwort wie erhalten das:

{ 
    "success" : true, 
    "message" : "Login success", 
    "token"  : "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJod…n19fQ.EMMT6wJeoF7Y52c3UQzgw3rkTY0WduGYq...........", 
    "name"  : "Jony", 
    "user_role" : "editor" 
} 

Hier Nach der korrekten Überprüfung der Anmeldeinformationen, möchte ich auch die user_role überprüfen. Wenn user_role mit der Antwort übereinstimmt (Editor oder Abonnent), wird nur switchMap((data) => this.authService.storeData(data)) blockiert. Andernfalls wird angezeigt. Diese Rolle ist nicht zulässig Dialogfeld & Daten wurden auch nicht gespeichert. [Ich habe diese Logik hier nicht hinzugefügt, da ich nicht weiß, wie das geht. aber das ist was ich suche].

otpVerify Funktion im AuthService ist so etwas wie die:

otpVerify(body: any): Observable<any> { 
    let headers = new Headers(); 
    headers.append('Content-Type', 'application/json'); 
    this.options = new RequestOptions({ headers: headers }); 
    return this.http.post(AppSettings.API_ENDPOINT2 + 'login', body, this.options) 
    .map(response => response.json()) 
    .catch(this._errorHandler); 
} 

Nach dieser OTP Überprüfung mag ich Zustand versetzen auch zu sehen, dass es ein gültiger Benutzer ist oder nicht. Wenn alles gut geht, werde ich die Daten speichern, ansonsten eine Fehlermeldung anzeigen. Bitte hilf mir, das zu lösen.

+0

Sie wollen also die "Login" -Methode ändern, damit die Dinge funktionieren, oder? –

+0

ja @AdrienBrunelat –

+0

Was stimmt nicht genau mit dem aktuellen Code? Ich habe meine eckige Umgebung nicht eingerichtet und muss Ihnen nur mit Kopf helfen. –

Antwort

0

Ok, was ich Ihrer letzten Bearbeitung verstanden, dass würde uns die folgenden:

login(form: any, event: Event): void { 
    this.authService.otpVerify(form) 
    .switchMap(
     (data: any) => { 
     if (data.user_role === "editor" || data.user_role === "subscriber") { 
      return this.authService.storeData(data); 
     } else { 
      console.log("Insufficient privileges"); 
     } 
     }, 
     (err) => console.log(err)) 
    .subscribe(() => { 
     if (this.navCntrl.canGoBack()) { 
     this.navCntrl.pop(); 
     } else { 
     this.navCntrl.setRoot('TabsPage'); 
     } 
    }); 
} 

Der Code innerhalb der switchMap überprüft die Rolle und fordert storeData nur dann, wenn die Privilegien ausreichend sind.

+0

Arbeiten perfekt Sir, aber ich weiß nicht, warum es Block nicht abonnieren wird. –

+0

Seite wird nur vorher umgeleitet. –

+0

Meinst du, dass die Umleitung fehlschlägt, wenn Sie einen Benutzer mit der Rolle "Editor" oder "Abonnent" haben? –

Verwandte Themen