2016-06-22 4 views
1

필자는 새로운 상태를 계산할 때 장시간 사용하는 함수를 사용하고있다.Redux에서 "스레드 안전성"?

한편 다른 작업이 시작되고 처음 작업이 완료되지 않은 상태에서 상태를 변경합니다.

내가 올바르게 상상할 경우 작업 대기열이없고 상태가 예측할 수없는 방식으로 해결 될 수 있습니다.

나는 이것에 대해 전혀 염려해야 하는가?

나는 실제 스레드가 아니라 더 나은 표현이 부족하다는 개념을 의미합니다. 동작은 비동기식이며 상태 키는 참조로 액세스됩니다.

+0

브라우저에서 자바 스크립트 용 스레드는 하나뿐입니다. 따라서 긴 계산이 먼저 끝나고 두 번째 계산이 시작됩니다. Btw, 브라우저가 멈춰지기 때문에 긴 계산을하지 않아야합니다. (모든것, UI 및 계산을위한 하나의 스레드 만 기억하십시오) – Pierrickouw

+0

더 나은 표현이 부족한 것은 실제 스레드가 아닙니다. 동작은 비동기식이며 상태 키는 참조로 액세스됩니다. – firedev

답변

0

그건 당신 자신의 액션 크리에이터와 당신 자신의 리듀서의 책임이며, 당신의 액션과 레 듀서를 어떻게 개념적으로 구성하는지에 크게 관련이 있습니다. "비즈니스 로직"을 구성하는 Redux FAQ 질문은 여기에서 매우 관련이 있습니다 : http://redux.js.org/docs/FAQ.html#structure-business-logic.

썽크 액션 제작자는 getState에 액세스 할 수있는, 그래서 썽크가 현재 상태를 확인하고 그러한 예로서, 특정 조건 하에서 파견해야하는 것은 매우 흔한 일 :

// An example of conditional dispatching based on state 
const MAX_TODOS = 5; 

function addTodosIfAllowed(todoText) { 
    return (dispatch, getState) => { 
     const state = getState(); 

     if(state.todos.length < MAX_TODOS) { 
      dispatch({type : "ADD_TODO", text : todoText}); 
     }  
    } 
} 

귀하의 감속기도 할 수 있습니다 전성 검사 뿐만 아니라 : 개인적으로

function todosReducer(state, action) { 
    switch(action.type) { 
     case "ADD_TODO": { 
      if(state.todos.length >= state.maxTodos) { 
       return state; 
      } 

      return { 
       ...state, 
       todos : state.todos.concat(action.newTodo) 
      } 
     } 
     default : return state;   
    }  
} 

, 나는 그것이 아주 작은 않는 한 내 감속기 그냥 맹목적으로, 작업에 어떤 데이터의 병합이 싫어 (예를 들어, 같은, 현재 선택된 탭 또는 무언가의 이름) . 필자는 작업을 설정하기 위해 작업 작성자에게 합리적인 양의 논리를 부여하고, 작업 자체에 최소한의 데이터 만 포함하고 작업을 기반으로 작업을 수행 할 수있는 충분히 똑똑한 감속기를 선호합니다.

+0

연결하려는 Faq의 일부가 제거되었습니다. 업데이트 된 섹션에서 관련 섹션을 가르쳐 주시겠습니까? – firedev

+0

질문을 포함하여 전체 FAQ가 아직 있습니다. 불행히도 Gitbook 소프트웨어는 페이지가로드 된 후 페이지 상단으로 튀는 문제가 있습니다. 내가 FAQ를 썼을 때이를 고치기위한 플러그인을 추가했지만, 현재 문서 업로드에 실패한 것 같습니다. 해당 링크로 이동 한 다음 페이지가로드 된 후 URL 막대에서 Enter 키를 누르면 올바른 질문으로 바로 이동해야합니다. FAQ 페이지 상단의 목차에서 "비즈니스 로직"질문에 대한 링크를 찾을 수도 있습니다. 나중에 페이지 동작을 수정할 수 있는지 확인합니다. – markerikson

0

나는 똑같은 일에 관심이있어서 그냥 파기 만했다. 두 스레드가 동시에 dispatch() (가능한 경우) could raise an exception을 호출하는 것처럼 보입니다. 그러나 그것은 가능하지 않아야하며 오류 메시지는 특별한 다른 원인을 지적합니다. "작업 대기열"은 브라우저의 자체 이벤트 루프에 있습니다. 이 이벤트 루프는 비동기/상호 작용 콜백 (dispatch())을 한 번에 하나씩 실행합니다.