2017-02-08 15 views
1

a.loadb.load의 두 가지 작업이 있으며 그 뒤로 @effect가 등록되어 c에 대한 HTTP 호출을 수행합니다. 그러나 페이지로드시 ab 작업이 모두 전달되고 그 결과로 c이 두 번 요청되는 문제가 발생합니다. 두 작업에 모두 반응해야하는 이유는이 페이지에서 a 또는 b이 변경 될 수 있으며, 그렇다면 c에 대한 새 값을 요청해야하기 때문입니다.하나의 효과와 여러 작업으로 인해 여러 HTTP 요청이 발생했습니다

이 문제를 해결할 수있는 방법이 있습니까? 효과 내에서 이전 요청을 취소 할 수 있습니까?

감사합니다.

답변

1

당신은 사용하여 문제를 해결할 수 있어야 throttle operator - 그 관찰이 방출 될 때까지, 소스에 의해 방출되는 모든 값은 무시/스로틀하여, 관측을 반환하고 함수를 걸립니다.

throttle에 효과를 전달하면 느린 요청이 처리되는 동안받은 모든 동작이 무시됩니다. 예를 들면 : 당신이 당신의 HTTP 기반의 효과를이 방법으로 throttle를 사용하는 경우

import 'rxjs/add/operator/throttle'; 

@Effect() 
someEffect = this.actions 
    .ofType(SOME_REQUEST) 
    .throttle(() => this.someEffect) 
    .switchMap((action) => someSlowRequest(action.payload) 
     .map((result) => ({ type: SOME_RESPONSE, payload: result })) 
     .catch((error) => Observable.of({ type: SOME_ERROR, payload: error })) 
    ); 

, 그것은 보류중인 HTTP 요청이있는 경우 효과가 무시 트리거 조치를 볼 수 있습니다. 따라서 그것이 당신이 추구하는 행동이라면, 그것은 당신의 문제를 해결해야합니다. 귀하의 코멘트에 대해서는

, 당신은 밀접하게 간격 행동의 마지막이 처리되도록하려면, 당신은 사용을 고려 수 auditTime operator - 지정된 시간 동안 대기 한 후 가장 최근에 수신 된 값 방출되는 :

import 'rxjs/add/operator/auditTime'; 

@Effect() 
someEffect = this.actions 
    .ofType(SOME_REQUEST) 
    .auditTime(100) 
    .switchMap((action) => someSlowRequest(action.payload) 
     .map((result) => ({ type: SOME_RESPONSE, payload: result })) 
     .catch((error) => Observable.of({ type: SOME_ERROR, payload: error })) 
    ); 

또는 switchMap 연산자를 사용할 수도 있습니다.이 연산자는 새 값을받을 때 구독을 취소합니다. 그러나 내 이해는 ngrx 작업이 동 기적으로 전달되므로 각 작업에 대해 HTTP 요청이 이루어질 가능성이 있으며 구현이 취소를 관리하는 방법을 확신하지 못합니다. 응답이 단순히 무시되는 것일 수 있습니다.

+0

이 제안을 주셔서 감사합니다. 그러나 언급해야 할 것은 마지막 전화가 필요한 것입니다. 요청을 탈퇴하여 요청을 취소 할 수 있습니까? – maddockst

+0

고마워요. rxjs 운영자를 살펴볼 필요가 있다고 생각합니다. – maddockst

+1

답변을 업데이트했습니다. – cartant