首页 > 解决方案 > 合并不同的数据以响应 2-request

问题描述

Serviceangular该服务请求中创建了一个,或者web-API有 2 个method类似:

query(state: any, url: string, param?: any): void {

    url = this.baseUrl + url;
    this.isBusy.value = true;
    this.fetch(url, state, param)
        .subscribe((x) => {
                this.isBusy.value = false;
                this.view = x;
            }
        );
}

fetch(url: string, state: any, param?: any): Observable<GridDataResult> {
    state.dontShowSnak = true;


    let params = new HttpParams();
    if (param != null) {
        params = params.append('param', param);
    }
    return this.http
        .post(url, state, {params: params})
        .map(response => (<GridDataResult>{
            data: response['result']['items'],
            total: parseInt(response['result']['totalCount'], 10)
        }));
}

该服务是全球性的,所有应用程序都可以使用它。

现在!我有一个带有 4 个标签的页面。当页面启动时,第一个选项卡正在加载,如果我将更改选项卡并转到第二个选项卡(在获得第一个选项卡的响应之前),在第二个选项卡中,我将有第一个选项卡的响应或数据。为什么?

问题出在哪里?有问题kendo吗?还是我的service

但是现在我更改了我的service并创建 4 separate servicefor 4 选项卡,我没有这个问题。即使我将更改选项卡,所有数据都是正确的,然后才能获得最后一个选项卡的响应。

标签: angulartypescriptrxjskendo-grid

解决方案


您可以使用switchMap而不是mapon http.post()。这将终止正在进行的请求(从 tab1 启动)并创建一个新Observable的要为第二个选项卡发出的请求。这样您现在只能获取第二个选项卡的数据。

import { switchMap } from 'rxjs/operators';

fetch(url: string, state: any, param?: any): Observable<GridDataResult> {
    ......................
    return this.http
        .post(url, state, {params: params})
        .switchMap(response => { // using switchMap
            return Observable.of ({   
                data: response['result']['items'],
                total: parseInt(response['result']['totalCount'], 10)
            }) as Observable<GridDataResult>;
           }));
}

推荐阅读