Angular 使用RXJS忽略flatMap的错误

Angular 使用RXJS忽略flatMap的错误,angular,rxjs,Angular,Rxjs,我正在尝试使用flatmap生成一系列并行请求。问题是,如果我得到404,整个链就会断开,其余的请求就会被取消。有没有办法捕获404并返回一个空响应?getIterationsDashboard是我运行的初始方法 getAllProjects(): Observable<Models.Project[]> { var that = this; var authHeader = new Headers(); authHeader.append('Authori

我正在尝试使用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>();
    });
}
getAllProjects():可观察{
var=这个;
var authHeader=新标题();
append('Authorization','Basic${new Buffer('xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx:')。toString('base64')}`);
append('X-TFS-FedAuthRedirect','Suppress');
返回this.http.get(`${this.baseUrl}`{
标题:authHeader
}).map(res=>{
let body:Models.GetProjectsResponse=res.json();
返回body.value;
});
}
getAllTeams(项目:Models.project):可观察{
var=这个;
var url=[];
返回此.makeGetRequest(`https://technossus.visualstudio.com/DefaultCollection/_apis/projects/${project.id}/teams`).map(响应=>{
返回响应.value;
}).catch(错误=>{
return-Observable.empty();
});
}
getAllCurrentIterations(teamId:string,projectId:string):可观察{
返回此.makeGetRequest(`https://technossus.visualstudio.com/DefaultCollection/${projectId}/${teamId}/\u API/work/TeamSettings/Iterations?$timeframe=current`)。map(响应=>{
返回响应.value;
}).捕获((例如,捕获)=>{
log('无法获取团队');
从…返回({
长度:0,
值:[]
});
});
}
getIterationsDashboard(){
var=这个;
返回此.getAllProjects().flatMap(项目=>{
let dashboard:Models.TeamSprintDashboard[]=[];
返回Observable.forkJoin(projects.map)(project=>{
返回该.getAllTeams(project).flatMap(teamsResponse=>{
返回可观察的.forkJoin(teamsResponse.map)(team=>{
返回.getAllCurrentIterations(team.id,project.id).map(iterations=>{
返回{
projectId:project.id,
teamId:team.id,
迭代:迭代?迭代:[]
};
}).catch(ex=>{
console.log(“未成功”);
return-Observable.empty();
});
})).catch(错误=>{
return-Observable.empty();
});
});
}));
});
}
makeGetRequest(requestUrl):可观察{
var authHeader=新标题();
authHeader.append('Authorization','Basic${new Buffer('K3ULYRJ5SAID5TPR7L2HLHGTXEQYNMVLCWA4V47KN6L25EUPQKQ:')。toString('base64')});
append('X-TFS-FedAuthRedirect','Suppress');
返回此.http.get(requestUrl{
标题:authHeader
}).map(res=>{
let body:T=res.json();
返回体;
}).catch(错误=>{
return-Observable.empty();
});
}

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


对的如果在接收链中的任何位置出现一个
OnError
,它将终止整个查询,除非它被满足。您似乎已经在大多数地方正确地查找了错误,例如在
getAllTeams
中,但在
getAllProjects
中没有。谢谢你的提示。我没有调查问题中的完整代码:-/Returning Observable.of而不是Observable.empty解决了这个问题。你知道为什么吗?我不知道你的问题是什么,你的问题是什么。
return this.http.get(`${this.baseUrl}`, {
    headers: authHeader
}).map(res => {
    let body: Models.GetProjectsResponse = res.json();

    return body.value;
}).catch(err => Observable.of(null));