当前位置: 首页 > Web前端 > HTML5

深入理解ngrxeffect背后的工作机制

时间:2023-04-05 13:31:16 HTML5

博客地址:https://indepth.dev/posts/120...action是reducer的组成部分,也是effect的组成部分。NgRx确保action首先由reducers处理,之后它们最终将被effects拦截。actions是reducer的一部分,也是effect的一部分。NgRx确保动作首先由reducers处理,之后它们最终被effects拦截。Actions由Reducers处理,然后由effects解析。提供effectsforRoot和forFeature接收由其他.ts文件而不是特定类实例导出的输入参数。根据类获取metadata.EffectsModule.forRoot只能调用一次,因为该方法还会实例化Ngrx的其他重要服务,如EffectsRunner和EffectSources.Spartacus中的例子,并没有使用forRoot方法。effects输入参数是一个数组:这些是具体的effect实现类:注册effects(类)后,为了设置它们,将创建一个observable(在EffectSources的帮助下)并订阅(感谢EffectRunner);reducer:applicationstateentity的形状:保存app信息的地方,也是actions遇到reducers的地方,意思就是reducers被调用的地方,可能会引起state的变化State相当于model层,Store只是consumers和之间的状态中间件。状态是应用程序存储数据的地方。Store实体-数据消费者(例如:智能组件)和模型(State实体)之间的中间人。效果将被合并。所有效果(例如:由createEffect创建的效果)将被合并到一个单独的可观察对象中,其发射值将是动作。效果将被合并到一个可观察对象中,其发射值是动作。商店是还有stream的Observer:effect---->actions|-store拦截$AC的意思是一个类型:extendsActionCreatorV=Action,如果不指定V,默认类型是Action:ScannedActionsSubject:来自@ngrx/store并且它是一个Subject(因此是一个Observable),它会在分派动作时发出,但仅在处理状态更改之后发出。所以,当一个动作被分派时(Store.dispatch()),State实体将首先在reducer的帮助下根据该动作和当前状态更新应用程序状态,然后它将那个动作推送到一个动作流中,由ScannedActionsSubject创建。Storedispatch之后,首先状态机迁移,应用状态发生变化,这个系列是reducer驱动的。然后将动作推送到动作流。通过将Actions的源设置为ScannedActionsSubject,每当我们有类似this.actions$.pipe().subscribe(observer)的内容时,观察者将成为ScannedActionsSubject的观察者列表的一部分,这意味着当主题发出动作时(例如:主题.next(action)),所有注册的观察者都会收到它。这应该可以解释为什么所有的效果都会收到相同的动作,但是,在ofType的帮助下,这些可以被过滤掉-OfType的过滤效果。OfType为了确定哪些动作应该触发哪些效果,使用了OfType自定义运算符。维护动作和效果的拍摄关系。OfType内部也使用了RxJS的filterOperator:看Observable.pipe的实现:exportclassObservableimplementsSubscribable{/*...*/pipe(op1:OperatorFunction,op2:OperatorFunction):Observable;/*...*/}其中OperatorFunction指定接收一个observable作为参数并返回另一个observable的函数的类型:OperatorFunction:接受两个类型参数,T表示被原始Observable包装的类型,A表示返回的Observable中包含的类型。最后返回一个新的B.Store.dispatch(event)类型的Observable,它表示从UI(例如智能组件)发送了一个需要状态更改的事件。Store.dispatch()会将action(event)push到一个actionsstream中(不同于属于effects的):Actions可以理解为指令,通过UI/Service/Effects进行调度。Creator只是一个函数,它接受一个P类型的参数并返回一个R类型的对象。reducerReducers是负责状态变化的纯函数。reducer接口定义:exportinterfaceActionReducer{(state:T|undefined,action:V):T;}上面的语法定义了一个接口,它描述了一个函数类型。花括号是函数类型的具体定义,圆括号是这个函数的输入接口的定义。这个函数接收两个入参,形参是state和Action,类型是T(也可以接受undefined)和V,括号后面的冒号定义了返回参数类型也应该是T。显然,这个函数是状态机,根据当前状态和输入的动作(可以理解为指令,触发状态转换的指令),返回一个新的状态。TypeScript中通过定义接口来描述函数签名的方式与ABAP中的接口有很大不同。以address-verification.reducer.ts中的reducer为例:reducer是如何设置的?在index.ts中,import*as用于区分这些同名reducer:通过getReducers统一返回:通过reducerToken和getReducers提供provider信息:Provider用于@NgModule提供的元数据:Store不存储数据,它只是一个中间件。源代码:exportclassStoreextendsObservableimplementsObserver{constructor(state$:StateObservable,privateactionsObserver:ActionsSubject,privatereducerManager:ReducerManager){super();this.source=state$;}/*...*/}Store从外部接收数据,即state$。每次源(state$)发出时,Store类都会将值发送给它的订阅者。允许消费者??状态通信??||------------?newState------------?||<--------------------||||Store.source=$状态||||||<----存储数据|店铺|行动|状态|||------------------>?||||存储.dispatch()||------------?------------|??行动||新状态||??|--------------?|||减速器|<----状态变化||--------------Jerry更多原创文章在此:《王子熙》: