2016-12-03 16 views
9

I次のアクションの作成者があります。Reduxのアクションがディスパッチ終了するのを待って

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

問題がappendItemの前scrollToNextItemの実行が終了したとスクロール位置が間違ってされて終わるということです。

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

私が完了するappendItemアクションを待つことができますどのように私はscrollToNextItemを実行する前に、次のダニのためのスクリプト待ちの実行を行うためにsetTimeoutを追加することによって、これが事実であることを証明することができますか?

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 –

関連する問題