2017-08-03 64 views
2

我试着去了解的typeof效应NGRX, 引擎盖下是如何工作的,如果我在我的应用程序模块声明:NGRX ofType,@ NGRX /效应

.... 

@NgModule({ 
    imports: [ 
     EffectsModule.forRoot([TodosEffectsService]) 
], 

.... 

和我写的效果文件确认:

@Effect() createTodos$ = this.actions$ 
.ofType(CREATE_TASK) 
    .map(() => { 
     console.log('called'); 
      return { type: 'OTHER'}; 
}); 

@Effect() addTodos$ = this.actions$ 
.ofType(CREATE_TASK) 
    .map(() => { 
     console.log('called'); 
      return { type: 'OTHER'}; 
}); 

我试着了解,现在在运行时我发送一个动作 this.action $是订阅的,每次执行的时候都要匹配类型? 或ofType一次执行!?

如果它调用一次,当我调度行动如何知道每次女巫效果订阅/执行效果如何?

谢谢大家!

+0

https://www.youtube.com/watch?v=cyaAhXHhxgk这可能会有所帮助 –

+0

他们解释如何使用效果,而不是如何使用效果。我尝试了解它如何缓存动作类型,如果它每次都订阅所有效果动作并找到动作类型 – Alin

回答

5

简而言之,当调用.ofType()时,它会预订操作的源流并将匹配操作推送到生成的流中。所以它确实被称为一次。

如果我们看一下source code,我们将看到引擎盖下ofType使用filter操作rxjs库,这意味着this.action$.ofType(CREATE_TASK)可扩展到如何filter作品可以发现

this.action$.filter(action => action.type === CREATE_TASK) 

说明rxjsdocs

到公知的方法Array.prototype.filter类似,该操作者从源取值可观察,将它们传递给一个predicate函数,并只发出那些产生了true的值。

值得注意的是你的每一个需要的效果可观察到的(this.action$)作为输入,并返回一个新的观察到其认购只有一次,当效果被初始化。返回的observable定义了如何转换来自输入可观察项的动作,但不影响源可观察项本身。

在您的例子ofType()方法返回一个新观察到的是“听”到this.action$观察到的,只发出满足条件action.type === CREATE_TASK行动。然后返回map运算符,它还返回一个新的observable,它可以“侦听”ofType()调用返回的observable,并根据您传递的投影函数将接收到的每个动作转换为新值。但是,所有这些可观察对象都只在初始化时创建一次,并且当您分派动作时,它们只是通过可观察对象“流动”,进行过滤和转换。您可能还想更熟悉rxjs。我建议你去检查"You will learn RxJS"AndréStaltz的谈话,它应该给你一个直观的观察结果以及它们是如何工作的。

+0

感谢您的回复,所以如果我使用store.dispatch({type:CREAT_TASK,payload:payload});每次我派出一个行动,这个。动作$是执行所有效果(返回可观察),并检查(过滤器)如果类型是正确的? – Alin

+0

这是不错的表现(对于大规模效应)? – Alin

+0

如果你有'N'史诗每个使用'.ofType()',那么通常谓词'allowedTypes.some(type => type === action.type)'将被执行'N'类型,除非你有数百万史诗注册或通过了数百万个允许的动作类型(我想不是这种情况)。如果过滤器不接受某个动作,则链接操作符的回调(例如,传递给'map()'的函数)将不会执行。我会说你不应该关心'ofType()'的性能,只是不要创建数以百万计的史诗:) –