2017-12-27 4 views
0

Angular에서 경로가있는 resolve 필드에 목록이 포함 된 개체를 반환하고 목록의 각 항목에 대해 수정을 요청하는 추가 요청을 실행하려고합니다. 그것은 다음과 같은 :Observables를 순차적으로 연결하기

this.employeesService.getEmployees(route.parent.params['department']) 
    .map(employeesResponse => { 
    employeesResponse.employees.map(employee => 
     employee.status = this.employeesService.checkStatus(route.parent.params['department'], employee)) 
    }) 

getEmployees 래퍼 응답 객체를 반환

{ 
    operationId: 1 
    employees: [], 
} 

checkStatus는 직원 상태 인 문자열을 반환합니다.

나는 이것이 작동하지 않는다는 것을 알고있다. 그러나 나는 이것을 여러 가지 방법으로 시도해 보았고 그것이 어떻게 성취 될 수 있는지 전혀 모른다. 목록을 첫 번째 요청에서 반환 될 때이 작업을 수행하는 방법을 알고 있지만이 래퍼 개체를 유지해야합니다.

Rx로 이것을 수행하는 가장 좋은 방법은 무엇입니까? 나는 반작용 프로그래밍의 개념에 익숙하지 않다.

+0

만약 내가 제대로 이해하고

// Mock services const routeParamsDept = 'Sales'; const employeesService = { getEmployees: (department) => { return Rx.Observable.of({ operationId: 1, employees: [ {name: 'Joe', status: 'Perm', dept: 'Sales'}, {name: 'Jane', status: 'Temp', dept: 'Sales'} ] }); } } const checkEmployee = (department, employee) => Rx.Observable.of({status: 'Perm'}) const fetchedAndChecked = employeesService.getEmployees(routeParamsDept) .mergeMap(employeesResponse => employeesResponse.employees) .mergeMap(employee => { return checkEmployee(routeParamsDept, employee) .map(statusResponse => { employee.status = statusResponse.status; return employee }) }) .toArray() fetchedAndChecked.subscribe(console.log)
<script src="https://cdnjs.cloudflare.com/ajax/libs/rxjs/5.5.6/Rx.js"></script>

, 당신은 getEmployees 개체 대응 방법하지만 각 직원의 상태가 추가로합니다. 당신의'employees.map'은 각 직원에게 상태를 추가합니다 (forEach 여야합니다). rxjs 맵 메소드에서'return employeesResponse' 만하는 게 어떨까요? – LLai

답변

0

concurrency 인수와 함께 .mergeMap()을 사용하면 여러 항목을 동시에 수정할 수 있습니다. 이것은 주문 보존이 아니므로 문제가 될 수 있습니다.

주문이 필요한 경우 .concatMap()을 사용할 수 있습니다.

0

I 쉽게리스트 (변형체)가 다음 코드를 반환되는 결과 얻을 수

this.employeesService.getEmployees(route.parent.params['department']) 
    .mergeMap((employeesResponse: EmployeesResponse) => employeesResponse.employees) 
    .mergeMap((employee: Employee) => this.checkEmployee(route.parent.params['department'], employee) 
    .map(statusResponse => { 
    employee.status = statusResponse.status; 
    return employee 
    }) 

)를;

그러나 나는 그 목록을 원하지 않습니다. EmployeeResponse 안에 싸여 있기를 바랍니다. 이것은 내가 문제가있는 곳이지 조작자가 아닌 곳입니다.

+0

'mergeMap'은 배열에서 요소로 스트림을 분할하므로 각 항목을 매핑 할 수 있습니다. 그러면 toArray가 다시 함께 가져올 것이라고 생각합니다. –

0

답변에 따라, mergeMap 내부의 상태 확인 매핑을 취한 다음 toArray으로 목록을 다시 작성하십시오.

유일한 손실은 operationId입니다. 그게 중요합니까?

관련 문제