2016-12-03 1 views
9

나는 다음과 같은 행동 작성자가 :REDUX 동작이 발송 완료 될 때까지 기다립니다

export function scrolltoNextItem(item) { 
    return (dispatch, getState) => { 
    dispatch(appendItem(Item)); 
    dispatch(
     scrollToNextIndex(
     getState().items.length - 1 
    ) 
    ) 
    } 
} 

문제가 인 appendItem 전에 scrollToNextItem 실행이 완료되고 스크롤 위치가 잘못되는 것을 포기 끝나는입니다. 나는 scrollToNextItem를 실행하기 전에 이것은 setTimeout 스크립트의 실행이 다음 틱을 기다릴 수 있도록 추가하여의 경우 증명할 수 :

export function scrolltoNextItem(item) { 
    return (dispatch, getState) => { 
    dispatch(appendItem(Item)); 
    setTimeout(() => { 
     dispatch(
     scrollToNextIndex(
      getState().items.length - 1 
     ) 
    ) 
    }, 0); 
    } 
} 

어떻게 마무리 할 appendItem 조치를 기다릴 수있다?

this.setState({something: 'some thing'},() => { 
    console.log('something is set'); 
}); 

그러나 dispatch 어떤 콜백 기능을 제공하지 않습니다 : 표준 땅 반응에 난 그냥 setState 콜백을 사용합니다.

+0

에서 다음과 같이 호출 할 수있는 약속으로 인 appendItem을 감고

const appendItem = (item, dispatch) => new Promise((resolve, reject) => { // do anything here dispatch(<your-action>); resolve(); } 

에 인수로 dispatch를 전달할 수 있습니다? –

+0

항목 추가는 단순한 작업입니다. –

+0

그러면 동기화되어야하고 setTimeout에 도달 할 때까지 appendItem이 이미 완료되었습니다. @mikeRifgin –

답변

3

당신은 항상 어떻게 보면 인 appendItem 않습니다 그럼 당신은 scrolltoNextItem

export function scrolltoNextItem(item) { 
    return (dispatch, getState) => { 
    appendItem(Item, dispatch).then(() => { 
     dispatch(
     scrollToNextIndex(
      getState().items.length - 1 
     ) 
    ) 
    }) 
    } 
} 
+1

물론, 왜 그런 생각을하지 않았습니까! 감사합니다 :) 위의 예에서 setTimeout을 제거하겠다고 가정하고 있습니까? –

+2

작업 완료 후'resolve()'가 어떻게 보장 되는가? – Alvaro

+0

예. 썽크 또는 기타 비동기 작업 (http://redux.js.org/docs/advanced/AsyncActions.html)을 사용하지 않는 한 작업은 일반적으로 동기식입니다. –

관련 문제