javascript - RxJS 和 Angular HttpClient : How to transform value asynchronously?

标签 javascript angular rxjs rxjs5

我想对可观察对象发出的值应用异步转换函数。

@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/

相关文章:

angular - 默认选择第一个菜单项

javascript - 链式可观察排放?

Angular 获取路由参数,switchMap 不起作用

javascript - RxJS:flatMap 一个包含 promise 结果的值数组

javascript - 省略数组的 if 循环

javascript - 从对象访问属性/方法 (javascript)

javascript - Google Apps 脚本 UrlFetchApp 异常

javascript - 在express.js中为每个请求设置全局res.local变量

angular - ng2-translate - 找不到管道 'translate'

angular - 如何从 Angular 应用程序的 URL 片段中检索参数?