【问题标题】:Ignoring errors with flatMap using RXJS使用 RXJS 忽略 flatMap 的错误
【发布时间】:2016-06-07 12:29:14
【问题描述】:

我正在尝试使用 flatmap 来发出一堆并行请求。问题是,如果我收到 404,则整个链都会中断,其余的请求将被取消。有什么方法可以捕获 404 并返回一个空响应? getIterationsDashboard 是我运行的初始方法。

getAllProjects(): Observable<Models.Project[]> {
    var that = this;

    var authHeader = new Headers();
    authHeader.append('Authorization', `Basic ${new Buffer('xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx:').toString('base64')}`);
    authHeader.append('X-TFS-FedAuthRedirect', 'Suppress');

    return this.http.get(`${this.baseUrl}`, {
        headers: authHeader
    }).map(res => {
        let body: Models.GetProjectsResponse = res.json();

        return body.value;
    });
}

getAllTeams(project: Models.Project): Observable<Models.Team[]> {
    var that = this;
    var urls = [];

    return this.makeGetRequest<Models.GetTeamsResponse>(`https://technossus.visualstudio.com/DefaultCollection/_apis/projects/${project.id}/teams`).map(response => {
        return response.value;
    }).catch(err => {
        return Observable.empty<Models.Team[]>();
    });
}

getAllCurrentIterations(teamId: string, projectId: string): Observable<Models.Iteration[]> {
    return this.makeGetRequest<Models.GetIterationsResponse>(`https://technossus.visualstudio.com/DefaultCollection/${projectId}/${teamId}/_apis/work/TeamSettings/Iterations?$timeframe=current`).map(response => {
        return response.value;
    }).catch((ex, caught) => {
        console.log('Couldn\'t get team');
        return Observable.from<Models.Iteration[]>({
            length: 0,
            value:[]
        });
    });
}

getIterationsDashboard() {
    var that = this;

    return this.getAllProjects().flatMap(projects => {
        let dashboard: Models.TeamSprintDashboard[] = [];


        return Observable.forkJoin(projects.map(project => {
            return that.getAllTeams(project).flatMap(teamsResponse => {

                return Observable.forkJoin(teamsResponse.map(team => {
                    return that.getAllCurrentIterations(team.id, project.id).map(iterations => {

                        return {
                            projectId: project.id,
                            teamId: team.id,
                            iterations: iterations ? iterations : []
                        };
                    }).catch(ex => {
                        console.log('no success');

                        return Observable.empty();
                    });
                })).catch(err => {
                    return Observable.empty();
                });
            });
        }));

    });
}

makeGetRequest<T>(requestUrl): Observable<T> {
    var authHeader = new Headers();
    authHeader.append('Authorization', `Basic ${new Buffer('k3ulyrj5xaid5tpr7l2hlhgtxeqynmvmlcwa4v47kn6l25eupqkq:').toString('base64')}`);
    authHeader.append('X-TFS-FedAuthRedirect', 'Suppress');

    return this.http.get(requestUrl, {
        headers: authHeader
    }).map(res => {
        let body: T = res.json();

        return body;
    }).catch(err => {
        return Observable.empty<T>();
    });
}

【问题讨论】:

    标签: angular rxjs


    【解决方案1】:

    我认为catch应该做你想做的事(需要导入):

    return this.http.get(`${this.baseUrl}`, {
        headers: authHeader
    }).map(res => {
        let body: Models.GetProjectsResponse = res.json();
    
        return body.value;
    }).catch(err => Observable.of(null));
    

    【讨论】:

    • 正确。如果OnError 出现在 Rx 链中的任何位置,它将终止整个查询,除非它得到满足。您似乎已经在大多数地方正确地解决了错误,例如在getAllTeams 但不在getAllProjects
    • 对。感谢您的提示。我没有调查问题中的完整代码:-/
    • 在我的捕获中返回 Observable.of 而不是 Observable.empty 解决了这个问题。知道为什么会这样吗?
    • 从您的问题中,我看不出您对Observable.empty 有什么问题。
    猜你喜欢
    • 2023-04-06
    • 2017-09-10
    • 1970-01-01
    • 2016-12-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-23
    • 2023-03-23
    • 2020-04-12
    相关资源
    最近更新 更多