2个观察者,必须根据值返回其中一个

时间:2019-03-25 09:22:21

标签: angular typescript rxjs observable

我是Angular的初学者,正在使用Angular 4和Ionic 3。 我有一个应该返回Observable的方法。

在这种方法中,我必须根据第一个的值在2之间选择良好的Observable。

我尝试了多种方法来执行它,但是我对异步性表示怀疑。

由于异步,以下代码无法正常工作,但我找不到另一种方法。

let obs: Observable<T>;
let localFile: FileBase64Model;
/* This will get my first observer I got to check his value */
obs = this.localDataBaseSrv.getQualityCheckpointFile(fileId) as Observable<T>;
    return obs.pipe(
      map(file => {
        // If observer value is not true I got to return another observer
        if(!file) {              
          // I cannot return observable here, so I'm trying to get value of other observable and put it in my observable that will be return
          this.get(`/${fileId}`, undefined, body).subscribe(value =>     localFile = value as FileBase64Model);
        } else {
          return file;
        }
      }),
      map( file =>  {
        // When code is here, the localFile is not yet complete because of asynchronous subscribe method !
        if(!file) {              
          return localFile;
        } else {
          return file;
        }
      })
    );

有人可以帮助我吗?

1 个答案:

答案 0 :(得分:1)

尝试一下:

obs = this.localDataBaseSrv.getQualityCheckpointFile(fileId) as Observable<T>;
    return obs.pipe(
      mergeMap(file => {
        // If observer value is not true I got to return another observer
        if(!file) {              
          return this.get(`/${fileId}`, yourOptions);
        } else {
          return of(file);
        }
      })
    );

这使用的是扁平化运算符mergeMap,因此您在执行get()请求时不会返回Observable的Observable,这也可以满足您的目的。