2016-06-07 2 views
2

Я пытаюсь использовать flatmap, чтобы создать кучу параллельных запросов. Проблема в том, что, если я получаю 404, вся цепочка прерывается, а остальные запросы аннулируются. Есть ли способ поймать 404 и вернуть пустой ответ? getIterationsDashboard - это начальный метод, который я запускаю.Игнорирование ошибок с помощью плоской карты с использованием RXJS

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>(); 
    }); 
} 

ответ

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)); 
+0

Correct. Если «OnError» встречается где угодно в цепочке Rx, он завершает весь запрос, если он не обслуживается. В большинстве случаев вы, кажется, уже неправильно используете ошибки. в 'getAllTeams', но не в' getAllProjects'. –

+0

Справа. Спасибо за подсказку. Я не исследовал полный код в вопросе: -/ –

+0

Возвращение Observable.of в мой catch вместо Observable.empty исправил проблему. Любая идея, почему это так? – Slick86