我想对可观察对象发出的值应用异步转换函数。
@Injectable
export class ApiService{
constructor(private http: HttpClient){}
getSomething(url): Observable<any>{
return this.http.get(url);
}
}
在上面的代码中,我想对 this.http.get(url)
发出的值应用一个转换函数 myFunc
,它返回一个 promise 。
通常我会使用RxJS的map运算符,但是由于转换函数返回一个promise,所以我找不到处理它的方法。
例如,让我的函数为:
function myFunc(value){
return new Promise((resolve, reject) => {
// modify the value async
resolve(modifiedValue);
// ...
});
}
有合适的方法来处理这个任务吗?我认为以下内容不合适,对吗?
返回 this.http.get(url).map(myFunc);
任何帮助将不胜感激。
注意:我正在使用 RxJS 5.5.2
最佳答案
使用mergeMap
运算符获取响应值,通过另一个Observable操作异步执行一些修改,然后返回修改后的值。该运算符将合并 HttpClient 和修饰符 Observable 发出的值,并返回发出变异值的单个 Observable。
编辑:包括@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);
}
}
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
关于javascript - RxJS 和 Angular HttpClient : How to transform value asynchronously?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47702400/