2017-12-21 27 views
2

이 게시물의 제목이 내 문제를 잘 설명하는지 잘 모르겠지만, 여기에 내 상황이 있습니다.여러 개의 연속 효과가 완료되지 않습니까?

나는 나무가 느슨해 진 아이들이 있습니다. 트리 노드를 확장하면 페이로드로 방금 확장 된 상위 노드가있는 LoadChildrenAction을 전달합니다. 난 그냥 하나의 노드를 확장하면

@Effect() 
    loadChildren$: Observable<Action> = this.actions$ 
    .ofType(ActionTypes.LOAD_CHILDREN).switchMap((action: LoadChildrenAction) => { 
     return this.categoryService.loadChildren(action.payload).map(
     children => 
      new LoadChildrenSuccessAction({ 
      parent: action.payload, 
      children 
      }) 
    ); 
    }); 

, 이것은 완벽하게 작동합니다 :

여기 내 효과입니다. LoadChildrenSuccessAction이 전달되고 제 감속원에서 트리를 업데이트합니다.

그러나 노드를 확장 한 다음 첫 번째 작업이 완료되기 전에 다른 노드를 확장하면 마지막 작업 만 완료됩니다.

즉 첫 번째 노드가로드되는 동안 다른 노드를 즉시 확장 한 다음 한 노드를 확장합니다. 두 번째 트리 노드는 하위 컨텐츠로 업데이트되지만 첫 번째 노드는 결코 업데이트되지 않습니다. 실제로 각 확장에 대해 하나씩 LoadChildrenAction이 전달되지만 하나만LoadChildrenSuccessAction이 전달됩니다.

categoryService.loadChildren 함수 안에 console.log을 넣으면 두 번 기록되므로 서비스가 두 번 호출됩니다. 그러나 하나의 액션 만 전달되므로 첫 번째 액션을 잃게됩니다. 완료되지 않습니다.

내가 여기 잘못 생각한 이유는 무엇입니까?

+1

[RxJ 시퀀스를 슈퍼 직관적 인 대화 형 다이어그램과 결합하는 방법에 대해 자세히 알아보십시오.] (https://blog.angularindepth.com/learn-to-combine-rxjs-sequences-with-super-intuitive-interactive-diagrams) -20fce8e6511)'switchMap'과'mergeMap'의 차이를 이해하십시오 –

답변

2

.switchMap을 사용하고 있기 때문에 이것은 다음 관찰 가능 항목이 방출되기 전에 완료되지 않은 이전 관찰 가능을 취소하기 때문입니다. 첫 번째 loadChildren이 호출되고 두 번째 호출이 완료되기 전에 호출되면 첫 번째 호출이 취소됩니다.

대신 loadChildren을 여러 번 호출 할 수 있도록 .mergeMap을 사용할 수 있습니다. 이 기능을 사용하면 중복 요청을 다소 자동으로 취소 할 필요가 없으므로 이와 같은 기능이 필요할 경우 직접 처리해야합니다.

+0

고마워요! 이것은 문제를 해결했습니다. RxJS에 대해 배울 점이 많습니다. –