【问题标题】:Issue with MergeMap with forkJoin Angular 5使用 forkJoin Angular 5 的 MergeMap 问题
【发布时间】:2018-08-01 08:33:32
【问题描述】:

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

我的函数将执行第一个 api,如果它返回状态为“NOT_FOUND”,那么我需要再执行 5 个 api 并需要返回最终结果。如果我得到的状态与“NOT_FOUND”不同,只需从第一个 http 请求返回 observable。我尝试了不同的选项,但似乎没有任何效果。在共享代码下方,我收到“ERROR TypeError: Unable to get property 'map' of undefined or null reference”

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

【问题讨论】:

    标签: angular http observable rxjs5 fork-join


    【解决方案1】:

    在您设置this.result 的第一个map 中,您不会返回任何内容。这意味着,链的以下部分将在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
        } )
    ...
    

    或者,您应该将mergeMap 中所有出现的response 替换为this.result

    【讨论】:

    • 感谢您的快速帮助。那是问题之一。我没有得到回应。但现在又出现了另一个错误——错误类型错误:对象不支持属性或方法“映射”。第二个和第三个电话也没有发生。
    • 我已经从 RxJs 导入了 forkjoin 的 observable、map、mergeMap
    • 如果response不是一个数组,你不能map它。map是一个数组原型方法。 ([1,2,3].map(...) 可以,但{a: [1,2,3]}.map 不行)
    • 响应是一个数组。如果我单独执行 api 调用,map 可以与此逻辑中使用的所有 api 正常工作
    • 你是this.result.status,其中this.resultresponse 相同——这对我来说是一个提示,response 是某种映射,而不是数组...?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-08
    相关资源
    最近更新 更多