2016-12-03 3 views
9

Ich habe die folgende Aktion Schöpfer:Warten Sie eine Redux Aktion letztendlich beenden

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

Problem ist, dass scrollToNextItem läuft vor AppendItem beendet hat und die Scroll-Position endet nicht mehr korrekt sind. Ich kann beweisen dies der Fall ist durch eine setTimeout Hinzufügen der Ausführung des Skripts für die nächste Zecke warten zu machen, bevor scrollToNextItem ausgeführt wird:

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

Wie kann ich für die appendItem Aktion warten zu beenden? Im Standard-Land reagieren würde ich den setState Rückruf benutzen Sie einfach:

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

Aber dispatch keine Rückruf Funktionalität.

+0

Wie sieht AppendItem? –

+0

Artikel anhängen ist nur eine einfache Aktion. –

+0

Dann sollte es synchron sein und bis Sie SetTimeout erreichen, appendItem ist bereits fertig @mikeRifgin –

Antwort

3

Sie können immer wickeln AppendItem in ein Versprechen und übergeben dispatch als Argument, um es

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

Dann können Sie es so nennen von scrolltoNextItem

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

Natürlich, warum habe ich nicht daran gedacht! Danke :) Ich gehe davon aus, dass du das setTimeout aus deinem obigen Beispiel entfernen willst? –

+2

Wie garantiert dies, dass 'resolve()' aufgerufen wird, nachdem die Aktion abgeschlossen ist? – Alvaro

+0

Ja. Aktionen sind normalerweise synchron, es sei denn, Sie verwenden Thunk- oder andere asynchrone Aktionen http://redux.js.org/docs/advanced/AsyncActions.html –

Verwandte Themen