loading从true到false:单从initiator一栏很难找到哪一行应用代码发起了购物车加载:根据[Cart]加载cart关键字搜索可以找到:最终找到准确的代码行数,调用CartConnector读取数据:首先检查是否有这个cart的pendingrequest:使用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}`;})复制代码);/*"第一个来源(5s):0第二个来源(1s):4""第一个来源(5s):1第二个来源(1s):9""第一个来源(5s):2第二个来源(1s):14"...*/constsubscribe=example.subscribe(val=>console.log(val));因为hostObservable的时间间隔是5秒,所以每隔5秒,console面板会增加一个新的输出,hostObservable的增量值为5,但是此时因为传入的inputObservable的时间间隔使用withLatestFrom运算符是1秒,所以每经过5秒,第二个Observable的递增序列为5:如果有,它不会再继续执行,进一步的执行会被过滤器运算符阻止。它可以继续到代码的第60行,表明此时没有pendingProcess应用于Cart。ActiveCartServicei依赖MultiCartService:在isStableSelector中添加打印语句:会频繁触发:比如会触发下面的调用:在这里加载当前用户的购物车:为什么会触发下面的代码?因为Spartacus有大量的createSelect调用:如下图:createSelector的输入参数由一个Selector和一个projector组成。createSelector支持可变数量的参数。前n-1个参数都被当成selectors,最后一个参数是projector:为什么调用下图中getCartIsStableSelectorFactory实现体的第58行?是因为CartLoad场景调用了MultiCartService的isStable方法吗?没错:所以每次isStable的返回值可能发生变化时,都会调用getCartIsStableSelectorFactory中的projector重新计算isStable的最新值。
