Czy store.dispatch w Redux jest synchroniczny lub asynchroniczny

104

Zdaję sobie sprawę, że to podstawowe pytanie, ale nie udało mi się znaleźć odpowiedzi gdzie indziej.

Czy jest store.dispatchsynchroniczne czy asynchroniczne Redux?

W przypadku, gdy jest to asynchroniczne, czy istnieje możliwość dodania wywołania zwrotnego po propagowaniu akcji, tak jak jest to możliwe w przypadku React?

ps-aux
źródło
Zauważ, że stan jest aktualizowany synchronicznie ( getState()), ale mapStateToPropstak nie jest. Podobnie this.props.valuejak stara wartość, podczas gdy getState().valuejest nowa --codeandbox.io/s/reactredux-forked-0m5eo?file=/Page.js
Mosh Feu

Odpowiedzi:

89

AFAIK, akcja dyspozytorska jest synchroniczna. W przypadku, gdy chcesz zaadresować wywołanie asynchroniczne, możesz użyć thunk-middleware w redux, gdzie wysyłka jest dostarczana jako funkcja zwrotna, którą możesz wywołać według własnego uznania. Aby uzyskać więcej informacji, sprawdź tę odpowiedź w SO od samego autora: Jak wysłać akcję Redux z limitem czasu?

agpt
źródło
69

Nikt nie wie lepiej niż sam kod . =) Jak widać dispatchjest absolutnie synchroniczny. Jedynym ostrzeżeniem jest to, że store enhancersmoże (i robi) substytucję dispatchmetody. Na przykład, spójrz na applyMiddlewarewzmacniacz , który pozwala na podłączenie oprogramowania pośredniego poprzez zastąpienie domyślnej dispatchmetody jej własną implementacją. Chociaż nigdy nie widziałem żadnego Reduxa, enhancerktóry faktycznie usuwałby synchroniczną naturę dispatch.

fkulikov
źródło
1
Powinieneś zaktualizować link do aplikacji pośredniczącej na https://github.com/reduxjs/redux/blob/master/src/applyMiddleware.ts#L19 (ze względu na migrację redux z js -> ts, nie mogę dokonać edycji ponieważ ma mniej niż 6 znaków). A może powinieneś odwołać się do zatwierdzenia, gdy nadal używają js, jak w twoim code itselflinku, co spowodowałoby martwe linki ze względu na aspekt `` permalink '' w zatwierdzeniach.
user7413060