2016-07-31 4 views
0

나는 redux-saga 채널 문서를 검토하고있었습니다. 나는 코드로 실행 여기서 당신은 그것이 끝이 없을 것입니다 무한 루프입니다 볼 수 있듯이break 문없이 while (true) 루프를 끝내는 것이 어떻게 가능합니까?

export function* saga() { 
    const chan = yield call(countdown, value) 
    try {  
    while (true) { 
     let seconds = yield take(chan) 
     console.log(`countdown: ${seconds}`) 
    } 
    } finally { 
    if (yield cancelled()) { 
     chan.close() 
     console.log('countdown cancelled') 
    }  
    } 
} 

, 당신은 휴식을 전화 또는 던져 예외해야 하나. 그러나 위의 예에서는 아무 것도 해당하지 않습니다. 위의 코드 나 호출하는 함수 내에서 중단 또는 예외가 발생하지 않습니다. 위의 무한 루프가 어떻게 끝나서 finally 블록에 도달 할 수 있습니까?

는 볼 수 없습니다 :이 줄은 것 같다 http://yelouafi.github.io/redux-saga/docs/advanced/Channels.html

+1

왜 그렇습니까? 예외는 발생하지 않습니까? (내 추측은 예외가 던져 질 것입니다.) – smarx

+0

'yield'가 무엇인지,'function' 다음에'*'가 무엇인지 궁금하지 않으셨습니까? * "예외는 없습니다 ... 호출 함수에 던져지는 예외는 없습니다"* * * 호출 된 * 함수는 어떨까요? 'take()'는 무엇을합니까? – nnnnnn

+0

발전기 작동 방법을 알고 있습니다. 소스 코드를 살펴 보았고 정상적으로 처리되는 예외를 찾지 못했습니다. – mahadazad

답변

1

가 예외를 throw, 그것으로 어떤 전화

yield take(chan) 

수율 자기 반환 값에 전혀 그래서 거기에는 무한 루프.

UPDATE : 수율 작품이 여기 https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Operators/yield

+0

발전기 작동 방법을 알고 있습니다. runSaga가 정상적으로 예외를 처리하고 있다고 생각합니다. 이렇게하면 위 코드에서 예외를 처리 할 필요가 없으며 마지막으로 호출됩니다. 하지만 소스 코드에서 그런 코드가 보이지 않습니다. – mahadazad

0

위의 예는 here 참조 예에서 찾을 수 있기 때문에 REDUX - 사가의 인종의 루프의 탈옥 것입니다 발견 할 수있는 방법에 대한 자세한 내용은.

이 예제에는 클릭하면 CANCEL_INCREMENT_ASYC 동작을 전달하는 구성 요소가 있습니다. 무용담은 그 행동을 잡아 race effect의 발포합니다.

incrementAsync 함수는 while 루프 (위에서 본 것과 기본적으로 동일한 함수)에서 실행되므로 테이크 (CANCEL_INCREMENT_ASYNC)가 먼저 해결됩니다. 경주에서 잃어버린 기능 (위의 게시 된 기능)은 결과를 던져서 finally 블록으로 무용담을 다시 시작합니다.

취소로 이어질 수있는 link to the race-effect saga입니다.

0

당신이 countdown 기능에 무엇이 보면 secs이 크지 0보다

import { eventChannel, END } from 'redux-saga' 

function countdown(secs) { 
    return eventChannel(emitter => { 
     const iv = setInterval(() => { 
     secs -= 1 
     if (secs > 0) { 
      emitter(secs) 
     } else { 
      // this causes the channel to close 
      emitter(END) 
      clearInterval(iv) 
     } 
     }, 1000); 
     // The subscriber must return an unsubscribe function 
     return() => { 
     clearInterval(iv) 
     } 
    } 
) 
} 

(조각이 위로부터 : http://yelouafi.github.io/redux-saga/docs/advanced/Channels.html) 인 경우 당신은 특별한 END 조치가 방출 볼 수

END 조치는 여기 take(pattern) 설명서에 언급되어 있습니다.
http://yelouafi.github.io/redux-saga/docs/api/index.html#takepattern