我想对一个可观察到的值应用一个异步转换函数。
@Injectable
export class ApiService{
constructor(private http: HttpClient){}
getSomething(url): Observable<any>{
return this.http.get(url);
}
}在上面的代码中,我想对由myFunc发出的值应用一个转换函数myFunc,它返回一个允诺。
通常,我会使用RxJS的map操作符,但是由于转换函数返回一个承诺,所以我无法找到处理它的方法。
例如,让我的函数是:
function myFunc(value){
return new Promise((resolve, reject) => {
// modify the value async
resolve(modifiedValue);
// ...
});
}是否有适当的方法来处理这个任务?我觉得下面这个不合适,对吗?
return this.http.get(url).map(myFunc);
任何帮助都将不胜感激。
注:--我使用的是RxJS 5.5.2
发布于 2017-12-07 19:33:23
使用mergeMap操作符接收响应值,通过另一个可观察的操作异步执行一些修改,然后返回修改后的值。该操作符将HttpClient发出的值与可观察的修饰符合并,并返回一个可观察到的值。
编辑:包含@bygrace评论中的Observable.fromPromise位,以获得更完整的答案。
即
编辑:用于RxJs v5.5+
import { pipe } from 'rxjs/util/pipe';
import { mergeMap } from 'rxjs/operators';
@Injectable
export class ApiService{
constructor(private http: HttpClient){}
getSomething(url): Observable<any>{
return this.http.get(url).pipe(
mergeMap(myFunc)
);
}
private myFunc(x): Observable<any> {
// do some asynchronous modification that returns an Observable
return Observable.fromPromise(x);
}
}Pre RxJs v5.5
@Injectable
export class ApiService{
constructor(private http: HttpClient){}
getSomething(url): Observable<any>{
return this.http.get(url)
.mergeMap(data => {
// do some asynchronous modification that returns an Observable
return Observable.fromPromise(data);
});
}
}请参阅:http://reactivex.io/rxjs/class/es6/Observable.js~Observable.html#instance-method-mergeMap
https://stackoverflow.com/questions/47702400
复制相似问题