发布网友 发布时间:2024-09-25 19:08
共1个回答
热心网友 时间:2024-10-04 09:52
loading从true变为false:
单从这个initiator栏,是很难找到是哪一行应用代码,发起的这个cart加载:
根据[Cart]LoadCart关键字搜索是能找到的:
最后找到了准确的代码行数,调用CartConnector去读取数据:
首先查看针对这个cart,是否存在pending请求:
使用withLatestFrom操作符,查看这个cart是否有PendingProcesses:
withLatestFrom(this.store.pipe(select(getCartHasPendingProcessesSelectorFactory(payload.cartId))))这里使用withLatestFrom,从另一个Observable里进行数据查询。
下面这段代码组合了两个按照不同时间间隔,分别发射递增整数序列的Observable:
//RxJSv6+import{withLatestFrom,map}from'rxjs/operators';import{interval}from'rxjs';//emitevery5sconstsource=interval(5000);//emitevery1sconstsecondSource=interval(1000);constexample=source.pipe(withLatestFrom(secondSource),map(([first,second])=>{return`FirstSource(5s):${first}SecondSource(1s):${second}`;}));/*"FirstSource(5s):0SecondSource(1s):4""FirstSource(5s):1SecondSource(1s):9""FirstSource(5s):2SecondSource(1s):14"...*/constsubscribe=example.subscribe(val=>console.log(val));因为hostObservable的时间间隔为5秒,所以每个5秒钟,console面板新增一条输出,且hostObservable的递增值为5,但此时因为使用withLatestFrom操作符传入的输入Observable的时间间隔为1秒,因此每个5秒过去后,secondObservable的递增序列为5:
如果有,就不继续进行下去了,通过filter操作符阻止进一步执行。
能进行到代码60行,说明此时没有pendingProcess施加在Cart上。
ActiveCartServicei依赖到MultiCartService:
在isStableSelector里加上打印语句:
会频繁触发:
比如下面这个调用会触发:
此处加载当前user的cart:
为什么会触发下面这段代码?因为Spartacus有大量createSelect的调用:
如下图所示:
createSelector的输入参数由一个Selector和projector组成。
createSelector支持数量可变的参数,前n-1个参数都被当成selector处理,最后一个参数为projector:
下图getCartIsStableSelectorFactory实现体的第58行代码为什么会被调用?
是因为MultiCartService的isStable方法在CartLoad场景里被调用?
确实如此:
所以每一次可能引起isStable返回值发生变化的时候,getCartIsStableSelectorFactory里的projector都会被调用,重新计算isStable的最新值。
原文:https://juejin.cn/post/7097393793283915783热心网友 时间:2024-10-04 09:54
loading从true变为false:
单从这个initiator栏,是很难找到是哪一行应用代码,发起的这个cart加载:
根据[Cart]LoadCart关键字搜索是能找到的:
最后找到了准确的代码行数,调用CartConnector去读取数据:
首先查看针对这个cart,是否存在pending请求:
使用withLatestFrom操作符,查看这个cart是否有PendingProcesses:
withLatestFrom(this.store.pipe(select(getCartHasPendingProcessesSelectorFactory(payload.cartId))))这里使用withLatestFrom,从另一个Observable里进行数据查询。
下面这段代码组合了两个按照不同时间间隔,分别发射递增整数序列的Observable:
//RxJSv6+import{withLatestFrom,map}from'rxjs/operators';import{interval}from'rxjs';//emitevery5sconstsource=interval(5000);//emitevery1sconstsecondSource=interval(1000);constexample=source.pipe(withLatestFrom(secondSource),map(([first,second])=>{return`FirstSource(5s):${first}SecondSource(1s):${second}`;}));/*"FirstSource(5s):0SecondSource(1s):4""FirstSource(5s):1SecondSource(1s):9""FirstSource(5s):2SecondSource(1s):14"...*/constsubscribe=example.subscribe(val=>console.log(val));因为hostObservable的时间间隔为5秒,所以每个5秒钟,console面板新增一条输出,且hostObservable的递增值为5,但此时因为使用withLatestFrom操作符传入的输入Observable的时间间隔为1秒,因此每个5秒过去后,secondObservable的递增序列为5:
如果有,就不继续进行下去了,通过filter操作符阻止进一步执行。
能进行到代码60行,说明此时没有pendingProcess施加在Cart上。
ActiveCartServicei依赖到MultiCartService:
在isStableSelector里加上打印语句:
会频繁触发:
比如下面这个调用会触发:
此处加载当前user的cart:
为什么会触发下面这段代码?因为Spartacus有大量createSelect的调用:
如下图所示:
createSelector的输入参数由一个Selector和projector组成。
createSelector支持数量可变的参数,前n-1个参数都被当成selector处理,最后一个参数为projector:
下图getCartIsStableSelectorFactory实现体的第58行代码为什么会被调用?
是因为MultiCartService的isStable方法在CartLoad场景里被调用?
确实如此:
所以每一次可能引起isStable返回值发生变化的时候,getCartIsStableSelectorFactory里的projector都会被调用,重新计算isStable的最新值。
原文:https://juejin.cn/post/7097393793283915783