【发布时间】:2017-12-07 19:28:00
【问题描述】:
我想对 observable 发出的值应用异步转换函数。
@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);
// ...
});
}
有没有合适的方法来处理这个任务?我认为以下不合适,对吗?
return this.http.get(url).map(myFunc);
任何帮助将不胜感激。
注意:我使用的是 RxJS 5.5.2
【问题讨论】:
-
是什么让你觉得它不合适?你试过了吗?发生了什么?
-
是的,我试过了。我收到的价值与我预期的有些不同。我得到了一个像
{__zone_symbol__state: true, __zone_symbol__value : x}这样的对象,其中 x 是我所期望的,但正如您所见,它被包裹在另一个对象中。我不知道那些区域符号是什么 :) -
那么显示minimal reproducible example可能会有所帮助,目前还不清楚问题出在哪里。
-
为了澄清你的问题,我相信你是说你的映射函数是异步的(返回一个承诺),所以你不能使用
map运算符。您可以更改映射函数以返回一个可观察对象,然后使用switchMap运算符而不是map吗?为什么你的映射函数是异步的? -
好的,也许你可以这样做:
return this.http.get(url).switchMap(x => Observable.fromPromise(myFunc(x)));
标签: javascript angular rxjs rxjs5