2017-12-21 20 views
0

대화 상자를 열면 대화 상자 내의 양식 컨트롤에 대한 데이터를 미리로드하는 작업을 전달합니다. 작업은 원래 작업에 전달 된 배열의 각 id에 대한 데이터를 미리로드하는 새로운 작업 배열을 반환하는 효과에 의해 선택됩니다. 이것이 내가 동일한 유형의 여러 작업을 파견하고있어 처음 비록mergeMap은 이전 HTTP 호출을 취소합니다.

@Effect() 
preloadReferenceData$ = this.actions$ 
    .ofType(PRELOAD_REFDATA) 
    .pipe(
    map((action: PreloadRefData) => action.payload), 
    mergeMap(ids => { 
     const actions: Action[] = []; 
     ids.forEach((id) => actions.push(new LoadRefDataForId(id))); 
     return actions; 
    }) 
); 

일반적으로, 나는 성공적으로 효과에서 여러 새로운 작업을 파견하는 mergeMap 연산자를 사용, 그것은 내가 경험 한 처음 XHR 통화가 취소된다는 것입니다. XHR 통화가 취소 된 경우 switchMap의 사용을 의심했지만, 지금은 mergeMap을 사용할 때가 아닙니다.

actions

LoadRefDataForId {payload: "2441", type: "[Refdata] Load RefData"} 
LoadRefDataForId {payload: "7612", type: "[Refdata] Load RefData"} 
LoadRefDataForId {payload: "9411", type: "[Refdata] Load RefData"} 

의 내용이며,이 네트워크 로그

enter image description here

@Effect() 
loadRefDataForId$ = this.actions$ 
    .ofType(LOAD_REFDATA_FOR_ID) 
    .pipe(
    map((action: LoadRefDataForId) => action.payload), 
    switchMap((id) => this.service.loadRefData(id) 
    .pipe(
    map((occupations) => { 
     return new LoadRefDataForIdSuccessful({ id: id, occupations: occupations } as RefDataPayload); 
    }), 
    catchError((err, caught) => { 
     console.log(caught); 
     return caught; 
    }) 
    )) 
); 

왜있는 LoadRefDataForId 조치를 처리하는 효과에서 가져옵니다 티 그는 XHR을 취소했는데, 내가 mergeMap을 사용하고 있어도?

+0

당신이 LoadRefDataForId 작업을 처리 효과에 대한 코드를 추가 할 수 있습니다에

변경 그것? 이 중 하나는 어떤 종류의 요청을 담당하지 않습니다. –

+0

코드 @ Jota.Toledo가 추가되었습니다! 나는 switchMap을 mergeMap으로 변경하여 모든 것을 작동 시키려고 노력했지만 왜 그랬는지는 모르겠습니다. 병합 된 세 개의 분리 관측치가 없으며, 이들 중 어느 하나에서'switchMap'을 사용하면 해당 특정 스트림에만 효과가 발생해야합니까? –

+0

그리고 왜 닫기 플래그? 예, 그것은 왜이 코드가 작동하지 않습니까? - 유형의 질문입니다. 그러나 중요한 차이점은 그것이 어떻게 작동해야하고 왜, 그리고 결국 추론 질문을 가지고 논쟁한다는 것입니다. –

답변

2

취소는이 효과에 의해 발생 : 그것에 switchMap를 사용하여

@Effect() 
loadRefDataForId$ = this.actions$ 
    .ofType(LOAD_REFDATA_FOR_ID) 
    .pipe(
    map((action: LoadRefDataForId) => action.payload), 
    switchMap((id) => this.service.loadRefData(id) 
    .pipe(
    map((occupations) => { 
     return new LoadRefDataForIdSuccessful({ id: id, occupations: occupations } as RefDataPayload); 
    }), 
    catchError((err, caught) => { 
     console.log(caught); 
     return caught; 
    }) 
    )) 
); 

, 당신은 actions$ 스트림을 통과 마지막 LoadRefDataForId 액션/고려 처리해야한다고 말하고있다.

@Effect() 
loadRefDataForId$ = this.actions$ 
    .ofType(LOAD_REFDATA_FOR_ID) 
    .pipe(
    map((action: LoadRefDataForId) => action.payload), 
    mergeMap((id) => this.service.loadRefData(id) 
    .pipe(
    map((occupations) => { 
     return new LoadRefDataForIdSuccessful({ id: id, occupations: occupations } as RefDataPayload); 
    }), 
    catchError((err, caught) => { 
     console.log(caught); 
     return caught; 
    }) 
    )) 
); 
+0

왜 * 나는 * 종류의 이유를 이해하지만, 여전히'switchMap'가 작동하지 않는 이유를 정확히 이해하지 못합니다. 'switchMap'을'mergeMap '에서 병합 된 다른 관찰 가능한 스트림에서 사용할 수 있습니까? –