Angular 使用RXJS忽略flatMap的错误
我正在尝试使用flatmap生成一系列并行请求。问题是,如果我得到404,整个链就会断开,其余的请求就会被取消。有没有办法捕获404并返回一个空响应?getIterationsDashboard是我运行的初始方法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
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));