2017-03-31 3 views
1

나는 그것이 옳은 것인지 아닌지를 알기 위해 이것을 쓰고있다. 온라인으로 볼 예에ngrx/effects의 "부작용"개념의 올바른 사용에 대한 디자인 심문

, 패턴은 일반적으로 다음과 같이 간다 (추가 여기에 예/원격 데이터베이스 상태에와에 대한 삭제 작업) :

effects.ts :

@Effect() 
add$ = this.action$ 
    .ofType(ADD) 
    .switchMap((action: Action) => { 
    return this.http.put(...) 
     .map(response => response.json()) 
     .map(response => Observable.of({ type: ADD_SUCCESS, payload: action.payload })) 
     .catch(response => Observable.of({ type: ADD_FAIL, payload: response.status })) 

감속기. TS

... 
switch (action.type){ 
    case 'ADD_SUCCESS': 
    ... 
    return new_state; 
    case 'ADD_FAIL': 
    return state; 
} 

그것은 을 작동하지만 사용자가 느끼는대로 실행의 속도는 네트워크 얼마나 빨리에 따라 달라집니다.

reducer.ts

... 
switch (action.type){ 
    case 'ADD': 
    ... // make the adequate addition 
    return new_state; 
    case 'ADD_FAIL': 
    ... // delete the addition previously made 
    return new_state; 
} 

effects.ts :

@Effect() 
add$ = this.action$ 
    .ofType(ADD) 
    .switchMap((action: Action) => { 
    return this.http.put(...) 
     .map(response => response.json()) 
     .catch(response => Observable.of({ type: ADD_FAIL, payload: action.payload })) 

이에 그래서 높은 확률에 베팅 오류가 API에서 반환되지 않는다는 패턴 함께했다 패턴으로 데이터베이스에 저장하는 작업은 실제로 "부작용"입니다. API가 오류를 반환하는 경우는있을 수 있지만 가능한 경우에는 두 번째 작업이 수행되어 첫 번째 작업을 실행 취소합니다.

그러나 나는 온라인에서 제공 한 예제에서이 디자인을 아직 발견하지 못했습니다. 나는 아마추어 개발자이므로, 결국에는 잘못되었거나 위험하거나 비효율적 인 무언가를 놓쳤는 지 궁금합니다.

답변

1

내가 잘못/위험/비효율적이라고 말하지 않겠다. 모든 것은 프로그램 요구 사항에 주관합니다. 느린 네트워크를 처리하는 경우이를 고려해야합니다.

그런 상황에서 문제가 잘못되면 사용자는 작업이 완료 될 때까지 알 수 없습니다. 의 시나리오가 실제로 인 네트워크가 느리고 SUCCESSFAIL 작업을 모두 가지고있는 경우 사용자는 SUCCESS 작업을 수행해야하기 때문에 자신이 보유한 데이터에 자신이 있습니다. SUCCESS 작업을 건너 뛴 경우 사용자는 멀리 떠날 수 있으며 FAIL 작업이 발생할 때까지 데이터가 올바르지 않은지 알 수 없습니다. 결과가 미미하거나 사용자 워크 플로가 중단 될 수 있습니다.

이제 일반적으로 put 또는 post 요청을 제출하고 응답을받는 데 걸리는 시간이 다소 짧아야합니다. 그리고 귀하의 SUCCESS 또는 FAIL 조치는 너무 길어서 계산 시간이 오래 걸릴 수 없습니다.

예를 들어 결제 시스템을 예로 들어보십시오. 사용자가 체크 아웃하고 서버에 posts을 보냅니다. 게시가 성공했는지 여부를 알기 전까지는 확인 페이지로 라우팅하고 싶지 않습니다. 따라서 별도의 SUCCESSFAIL 조치가 필요합니다.

내가 본 데이터가 정확하고 실패 후 변경 사항을 롤백하지 않도록 최상의 사용자 환경을 제공한다고 생각합니다. 사용자 posts 또는 puts 서버에 무엇인가 있다면, SUCCESS 조치는 이전이 아닌 응용 프로그램 상태에 추가해야하며 가능한 사용자 통지도 추가해야합니다.A FAIL 조치는 응용 프로그램에 따라 사용자 통지, 잠재적 로깅 등을 처리합니다.

다른 예 : 사용자가 온라인 프로필을 편집하고 있다고 가정 해보십시오. 그들이 '저장'을 클릭하면 서버에 성공적으로 저장 될 때 사용자에게 알리 길 원합니다. 그런 식으로 그들은 페이지에서 벗어나지 않고 '나는 그것이 구원 받기를 바란다. 나는 대답을 얻지 못했다'라고 생각했다.

대부분의 시나리오에서는 SUCCESSFAIL 작업을 모두 수행하는 것이 적절하다고 말합니다. 그러나 내가 말했듯이, 모든 것은 응용 프로그램에 주관적이며 사용자 환경에 수용 가능한 것입니다.

희망이 있습니다.

+0

빠르고 정확한 답변을 해주신 Tyler에게 감사드립니다. 고전적인 디자인이 더 낫다는 것을 당신이 보여주는 예들에 동의합니다. 제안 된 디자인과 중요하지 않은 데이터 (예 : 프로젝트와 같은)에 대해서는 사용자에게 적절한 UI를 제공하여 자신의 행동이 완료되지 않았 음을 이해하도록 노력할 것입니다. – guenam