首页 > 解决方案 > 使用 forkJoin Angular 5 的 MergeMap 问题

问题描述

我正在尝试使用 mergeMap 和 forkJoin 有条件地执行 5 个并行 http 请求。对我来说,只有第一个 api 被执行,其余的 api 没有触发。

我的函数将执行第一个 api,如果它返回状态为“NOT_FOUND”,那么我需要再执行 5 个 api 并需要返回最终结果。如果我得到的状态与“NOT_FOUND”不同,只需从第一个 http 请求返回 observable。我尝试了不同的选项,但似乎没有任何效果。在共享代码下方,我收到“错误类型错误:无法获取未定义或空引用的属性‘映射’”

public myPostWrapper( url, body, flag): Observable<any> {
 return this.http.post( url, body, { headers: this.headers } )
        .map(( out: any ) => {
            console.log( 'out', JSON.stringify( out ) );
            this.result = out;
        } )
        .mergeMap(( response: any ) => {
            console.log( 'response-inside', JSON.stringify( response ) );
            if ( this.result.status === 'NOT_FOUND' ) {
                return Observable.forkJoin(
                    response.map(( resp: any ) => {
                        return this.http.post(url, body, { headers: this.headers })
                            .map(( res: any ) => {
                                const section: any = res;
                                return section;
                            } );
                    } ),
                    response.map(( resp: any ) => {
                        return this.http.post(url, body, { headers: this.headers })
                            .map(( res: any ) => {
                                const section: any = res;
                                return section;
                            } );
                    } )
                );
            } else {
                return Observable.of( this.result );
            }
        } )
        .catch(( error: any ) => Observable.throw( error || 'Server error' ) 
);

}

任何帮助/方向将不胜感激。注意我使用 Rxjs 5.52 和 Angular 5

标签: angularhttpobservablerxjs5fork-join

解决方案


在第一个map,你设置的地方this.result,你不返回任何东西。这意味着,链的以下部分将在undefined. 添加return out;到第一个map操作,这应该可以解决您的问题。

...
return this.http.post( url, body, { headers: this.headers } )
    .map(( out: any ) => {
        console.log( 'out', JSON.stringify( out ) );
        this.result = out;
        return out; // <--- This return here
    } )
...

或者,您应该将所有出现的response替换mergeMapthis.result


推荐阅读