2016-06-28 4 views
1

그냥 redux-sagas 주위를 돌아보고 사가에서 두 명의 관찰자를 설정하고 이후에 취소하는 문제를 해결하려고합니다.redux-sagas에서 여러 명의 관찰자를 설정하고 취소하는 방법

일부 배경 : JSON 스키마를로드하고 저장하기 위해 saga에서 백엔드 API 호출을 처리하는 JSON 편집기 구성 요소가 있습니다. 이 프로젝트는 React Boilerplate을 기반으로하므로 응용 프로그램의 구조는 거의 동일합니다.

가 여기에 관련 코드입니다 :

export function* loadSchemaWatcher() { 
    const action = yield take(LOAD_SCHEMA) 
    yield call(loadSchema, action) 
} 

export function* saveSchemaWatcher() { 
    while (true) { 
    const action = yield take(SAVE_SCHEMA) 
    yield call(saveSchema, action) 
    } 
} 

export function* editorData() { 
    const watcher = yield [ 
    fork(loadSchemaWatcher), 
    fork(saveSchemaWatcher) 
    ] 

    yield take(LOCATION_CHANGE) 
    yield watcher.forEach(task => cancel(task)) 
} 

export default [ 
    editorData, 
] 

내가 가정이 yield watcher.forEach(task => cancel(task))하는 것과 Tasks의 배열을 통해 루프하지만이 취소되지 않습니다.

+0

로 단순히'수율 테이크 (LOCATION_CHANGE)를 실행하지 않는 모든 이유가 대체되었습니다 '다음 직후'editorData()'에서 모두 포크? –

답변

6

forEach이 정의되지 않았기 때문에 코드가 작동하지 않습니다. 당신의 배열을 반환합니다 map로 교체해야 효과가

yield watcher.map(task => cancel(task)) 

또한 선언적으로 전체 배열 효과를 취소 할 race 효과를 사용할 수 있습니다 취소 할 수 있습니다. fork 참고는 call

export function* editorData() { 
    yield race([ 
    [ 
     call(loadSchemaWatcher), 
     call(saveSchemaWatcher) 
    ], 
    take(LOCATION_CHANGE) 
    ]) 
} 
+0

이것은 훨씬 더 나은 해결책입니다. 감사합니다! – hamishtaplin

+0

왜 eslint는 이렇게 좋아하지 않습니까? 오류 : 인종은 유일한 인수로 객체 해시에 있어야합니다. redux-saga/no-yield-in-race – Nirri