2016-12-03 28 views
9

Aşağıdaki eylem yaratıcısı vardır:redoks eylem gönderilmesi bitmesini bekleyin

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

Sorun appendItem önce scrollToNextItem çalışır tamamladı ve kaydırma konumu yanlış olmak biter olmasıdır. Ben scrollToNextItem çalıştırmadan önce bu setTimeout script yürütme sonraki kene beklemek yapmak ekleyerek böyledir kanıtlayabilirim:

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

nasıl bitirmek için appendItem eylem için bekleyebilir?

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

Ama dispatch herhangi geri işlevsellik sağlamaz: Standart arazi tepki olarak ben sadece setState geri arama kullanmak.

+0

bunun gibi diyebilirsin bir söz haline appendItem sarın ve

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

argüman olarak dispatch geçebilir? –

+0

Ek öğe sadece düz bir işlemdir. –

+0

O zaman eşzamanlı olmalı ve setTimeout'a ulaştığınız zaman, appendItem zaten bitmiş durumda. MikeRifgin –

cevap

3

Her zaman nasıl bakmak appendItem gelmez Sonra scrolltoNextItem

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

Elbette, neden bunu düşünmedim ki! Teşekkürler :) SetTimeout'u yukarıdaki örneğinizden kaldırmayı düşündüğünüzü farz ediyorum. –

+2

Bu işlem, işlem tamamlandıktan sonra '() işlevinin çağrılmasını nasıl garanti eder? – Alvaro

+0

Evet. Thunk veya başka bir eşzamanlama eylemi kullanmadığınız sürece normal olarak senkronize edilir. Http://redux.js.org/docs/advanced/AsyncActions.html –

İlgili konular