我是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;
}
})
);
有人可以帮助我吗?
答案 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,这也可以满足您的目的。