我想要链2的角度,其中第一个可观测的输出是需要在第二个可观测函数作为参数。
我创造了这样一个可观察的东西:

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();
          })
        })
      })
    })
  });
}

我想在我的登录页面中这样使用:
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");
    });
}

在这里,我将得到这样的答复:
{
   "success"   : true,
   "message"   : "Login success",
   "token"     : "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJod…n19fQ.EMMT6wJeoF7Y52c3UQzgw3rkTY0WduGYq...........",
   "name"      : "Jony",
   "user_role" : "editor"
}

在这里,在正确的凭据检查之后,我还要检查用户角色。如果用户角色与响应匹配(编辑器或订阅者),则只会转到otpVerify块,否则将显示“不允许此角色”对话框,并且数据也未存储。[我没有在这里添加这个逻辑,因为我不知道怎么做。但这正是我要找的。
switchMap((data) => this.authService.storeData(data))中的函数类似于:
 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);
 }

在这个otp验证之后,我想把条件也放进去,看看它是否是一个有效的用户。如果一切顺利,我将存储数据,否则显示一些错误消息。请帮我解决这个问题。

最佳答案

好吧,根据我对你最近编辑的了解,我们可以得出以下结论:

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');
      }
    });
}

switchmap中的代码检查角色并仅在权限足够时调用storeData

08-08 03:24