Angular 8-依次调用可观察对象

时间:2019-11-06 19:58:44

标签: angular observable

我正在尝试一个接一个地调用几个可观察对象。这是我的代码:

 // service1    
 login(username: string, password: string): any {
  this.service2.firstObservable(username, password)
    .pipe(map(
      data => {
          if (data) {
            return this.service2.secondObservable(data, username, password)
            .subscribe(token => {
              return true;
            });
          }
      },
      error => {
          this.service.error(error);
          return false;
      }
    ));
}

执行:

this.service1.login(this.f.username.value, this.f.password.value)
    .pipe(map(
      data => {
          // Login is successful 
      }
    ));

我得到:

Cannot read property 'pipe' of undefined

显然,service1.login返回错误的值。可以使某些东西起作用吗?

谢谢

更新1。

login(username: string, password: string): any {
  return this.service1.firstObservable(username, password)
    .pipe(switchMap(
      data => this.service1.secondObservable(data, username, password)
    ));
}

3 个答案:

答案 0 :(得分:1)

您可以尝试使用switchMap切换可观察对象,并记住在service1中返回值:

Error in value [[3L]](cond) : unused argument (cond)

之后,第二段代码应该工作。

答案 1 :(得分:0)

您可以使用flatMap来连接顺序请求:

 login(username: string, password: string): Observable<boolean> {
  this.service2.firstObservable(username, password)
    .pipe(flatMap(
      (data) => {
          if (data) {
            return this.service2.secondObservable(data, username, password).pipe(flatMap((token) => {return true;}))
          }
      },
      error => {
          this.service.error(error);
          return false;
      }
    ));
}

答案 2 :(得分:0)

您可以使用await,但是方法必须为voidasnyc

    async login(username: string, password: string) {
        let data = await this.service2.firstObservable(username, password).toPromise();
        if(data){
            let data2: boolean = await this.service2.secondObservable(data, username, password).toPromise();
        }
    }