@atomico/store is Naturally asynchronous.
Copy interface State {
api : string ;
loading : boolean ;
products : { id : number ; title : string ; price : number };
}
const initialState = (state : State ) => ({
api : "" ,
loading : false ,
products : [] ,
});
async function* getProducts (state : State ) {
yield { ... state , loading : true };
return {
... ( yield ) ,
loading : false ,
products : await ( await fetch ( state .api)) .json () ,
};
}
const store = new Store (initialState , {
actions : { getProducts } ,
});
Objectives
Finitely predictable asynchrony.
Modularity and composition.
Asynchrony management
Application events and service calls are naturally asynchronous, with @atomico/store you can use asynchronous functions or asynchronous generators to define the update cycle.
update cycle? By this I mean the states that occur sequentially when dispatching the action, example:
Copy async function* getProducts (state : State ) {
yield { ... state , loading : true };
return {
... ( yield ) ,
loading : false ,
products : await ( await fetch ( state .api)) .json () ,
};
}
The previous action will generate 2 states when dispatched:
state 1:{loading: true, products:[]}
state 2: {loading: false, products:[...product]}
The advantage of this is that the process is clearly observable by the store and by whoever dispatches the action.
Finitely predictable asynchrony
Every action in @atomico/store is wrapped in a promise that defines when it ends its cycle, this will let you execute actions sequentially, example:
Copy await store . actions .orderyBy ();
await store . actions .insert ({ id : 1000 });
await store . actions .updateAll ();
Modularity and composition
@atomico/store allows to decouple the actions and the state of the store, for a better modularization , example:
actions.js store.js
Copy export interface State {
api : string ;
loading : boolean ;
products : { id : number ; title : string ; price : number };
}
export const initialState = (state : State ) => ({
api : "" ,
loading : false ,
products : [] ,
});
export async function* getProducts (state : State ) {
yield { ... state , loading : true };
return {
... ( yield ) ,
loading : false ,
products : await ( await fetch ( state .api)) .json () ,
};
}
Copy import * as Actions from "./actions" ;
export default new Store ( Actions .initialStore , { actions : { Actions } });
API
Store