2017-11-21 9 views
0

한 번 호출되는 redux-saga가 있지만 두 번 실행됩니다. redux-saga를 두 번 주입했습니다.

은 사가 시작하는 작업입니다 :

export function createRequest (data) { 
    return { 
    type: CREATE_REQUEST, 
    payload: {data} 
    }; 
} 

을 내 sagas.js 파일이 방법 같습니다

export function* create (x) { 
    try { 
    const response = yield call(request, URL_TO_API, Object.assign({}, buildBaseHeaders('en'), { 
     method: 'post', 
     body: JSON.stringify(x.payload.data) 
    })); 
    yield put(createSuccess(response)); 
    } catch (error) { 
    yield put(createFailure(error)); 
    } 
} 

... my other sagas 

export default function* defaultSaga() { 
    yield takeLatest(CREATE_REQUEST, create); 
    ... my other calls 
} 

내가 요소가 내 반응에 무용담을 주입하고있어 방법 이 :

const withConnect = connect(mapStateToProps, mapDispatchToProps); 
const withReducer = injectReducer({key: 'myComponent', reducer}); 
const withSaga = injectSaga({key: 'myComponent', saga}); 

export default compose(withReducer, withSaga, withConnect) MyComponent; 

그러나 사가가 두 번 주입됩니다. 그럼 내가 뭘 놓치고 있니? MyComponent가 렌더링되는 횟수와 상관없이 무용담을 한 번만 주입하려면 어떻게해야합니까?

+0

누가 createSaga를 호출합니까? 두 번 실행되고 하나가 실패하면 create 기능을 한 번만 console'ing하는 것이 좋습니다. 나는 여기에 전체 그림을 놓치고있다./ – Lucio

+0

'create' 무언가는'createRequest' 액션을 통해 호출됩니다. 이 동작은 한 번 사용되지만 무용담은 두 번 호출됩니다. – assembler

+0

오, 이제 아이디어가 부족합니다. ( – Lucio

답변

1

그러나 사가가 두 번 주입됩니다. 그럼 내가 뭘 놓치고 있니?

해결책은 redux-sagas-injector npm 라이브러리 작동 방식에 따라 다릅니다. 일반적으로, saga은 일부 함수 호출이나 객체 삭제시 처리 할 수없는 "라이브"프로세스 관리자로 구성되어 있기 때문에, 무의미한로드 및 적용은 어렵습니다.
사가의 커스텀 틱 콜백 도메인 (약속, AJAX/XHR, setImmediate 등)을 실행할 수 있음을 의미합니다. 이는 사용자 정의 외부 코드에서 처리 할 수 ​​없습니다 (HMR이 부분 모드에서 sagas과 작동하지 않는 이유 및 전체 페이지를 다시로드해야 함).

따라서 라우터 전환시 saga 주입을 수행하는 경우 다음 두 가지 사항을 확인하십시오. 오래된 사가가 특별한 내부 기술 처분 조치처럼 외부 측면에서 처분하는 암시 적 조치를 갖고 있으며 라우터 측에 잘못 구성되지 않았 음을 확인하십시오. 예를 들어 페이지가 두 번 실행되었습니다.

+0

당신은 나에게 그것을 해결하는 방법에 대해 좋은 지적을 주셨습니다. – assembler