App.module.ts 的源代码:

export class AppModule { constructor(private config: DebugConfig,private actions$: Actions,private cartService: ActiveCartService){// console.log('Jerry config: ', this.config);this.actions$.pipe(ofType(CartActions.LOAD_CART),map((action: CartActions.LoadCart) => action.payload),tap((data) => console.log('Jerry cart: ' , data))).subscribe();this.cartService.getLoading().subscribe((data) => console.log('Jerry cart loading? ', data));}}

首先执行 ofType,这本质是一个 filter 操作:

数组的 some 方法:检查数组元素是否满足 predicate 函数指定的条件

然后执行 map 操作,返回一个 OperatorFunction,作为 pipe 的输入条件之一:

触发点:

quantity 的值来自 activeCartService 维护的 active cart 的 deliveryItemsQuantity 字段。

执行 Async pipe:

async pipe 的 transform 方法会调用 subscribe 方法:

createSubscription 最终会调用:

getActive 返回:

activeCart$ 的值来自 activeCartLoading$ 和 activeCartValue$ 两部分。

activeCartLoading$ 负责加载 cart,见代码第 139 行。

调用的是 ActiveCartService 的 loadCart 方法:

给 store 发送一个 action。

LoadCart 扩展自 EntityLoadAction,除了 payload 之外,定义了额外的字段:

比如 meta:

如果想打印出加载成功的购物车信息:

const action2 = this.actions$.pipe(ofType(CartActions.LOAD_CART_SUCCESS),map((action: CartActions.LoadCartSuccess) => action.payload),tap((data) => console.log('Jerry cart SUCCESS: ' , data)));action2.subscribe();const action3 = this.actions$.pipe(ofType(CartActions.LOAD_CARTS_SUCCESS),map((action: CartActions.LoadCartsSuccess) => action.payload),tap((data) => console.log('Jerry carts SUCCESS: ' , data)));action3.subscribe();

结果:

那么,这个加载成功的 Cart 数据,是如何通过 action 实例 subscribe 之后被读取出来的呢?

显然,单步调试第73行代码,并不会看到我们想了解的明细。因为 subscribe 只是触发 cart 的加载,而后者是一个异步过程。

F8之后断点再次触发时,cart 数据已经出现在 payload 里了。但是我们不知道是谁从哪里通过什么样的方式进行的回调。

在 subscriber 的实现里,能看到当前已经 ready 的 state 值:

ngrx-store.js 在这里将 state 片段的 carts 传入 map 回调函数里:

更多Jerry的原创文章,尽在:“汪子熙”:

SAP Spartacus 读取 Cart 的原理分析相关推荐

  1. SAP Spartacus NgExpressEngineDecorator 的工作原理

    首先看这个 class 的 get 定义: 接收两个输入参数,类型为: NgExpressEngine SsrOptimizationOptions 返回一个包装后的 NgExpressEngine ...

  2. SAP Spartacus读取User Address的action是如何被Effect接收的

    入口是shipping-address.component.ts的ngOnInit hook: 读取当前user ID后,将id传入回调函数,在回调函数里dispatch一个UserActions.L ...

  3. SAP Spartacus读取User Address的请求发送和接收源头

    先看请求响应的接收源头: 文件:projects\core\src\user\store\effects\user-addresses.effect.ts 接收应用程序发送过来的UserActions ...

  4. SAP Spartacus取cart的HTTP请求

    取cart的url:https://spartacus-dev0.eastus.cloudapp.azure.com:9002/occ/v2/electronics-spa/users/anonymo ...

  5. SAP Spartacus 读取payment detail数据的API

    url:https://spartacus-dev0.eastus.cloudapp.azure.com:9002/occ/v2/electronics-spa/users/current/payme ...

  6. SAP Hybris install.bat工作原理分析

    以Windows平台为例,install.bat的内容: @echo off SET INSTALLER_WORKING_DIR=%~dp0 javac %INSTALLER_WORKING_DIR: ...

  7. SAP Spartacus 的 CSS 架构

    在 Angular 中,组件的 CSS 样式被封装进了自己的视图中,而不会影响到应用程序的其它部分. 通过在组件的元数据上设置视图封装模式,你可以分别控制每个组件的封装模式. 可选的封装模式一共有如下 ...

  8. SAP UI5 应用的 OData 元数据请求响应的解析原理分析

    前一篇文章 SAP UI5 应用的 OData 元数据请求的发送原理分析我们学习了 SAP UI5 应用是如何自动发送 OData 元数据的 HTTP 请求. 本文继续学习该元数据请求的响应到达客户端 ...

  9. SAP Spartacus自定义指令cxOutlet的工作原理

    cxOutlet合集 SAP Spartacus自定义指令cxOutlet的工作原理 SAP Spartacus table cell如何通过cxOutlet在运行时动态注入组件 SAP Sparta ...

最新文章

  1. python中cgi到底是什么_python cgi是什么
  2. java 高级泛型_Java 泛型高级
  3. 【每日一题】4月7日题目精讲 树
  4. mysql 传统数据恢复_MySQL误操作后如何快速恢复数据 传统解法 利用binlog2sql快速闪回 常见问题 参考资料...
  5. SpringMVC框架使用注解执行定时任务
  6. windows 系统日志
  7. springMVC_08文件上传
  8. Wireshark基础知识(一)
  9. 【215期推荐】另类思考:HIS能给医院带来什么“坏处”?
  10. 技术支持----用户和产研沟通的桥梁
  11. 用php实现成绩管理系统,PHP成绩管理系统 PHP简单操作 学生成绩管理 成绩管理源码 三张表...
  12. 大厂必考深度学习面试题及参考答案
  13. Java Web入门之JSTL标签的解析及使用(超详细必看)
  14. 二维码生成 API数据接口
  15. pd.Series()函数
  16. 与小米一起“星辰大海,云端漫步”
  17. Aspose.Words 22.11.0 Crack | Aspose.Words
  18. 项目管理中如何合理分配资源
  19. 查看当前系统安装的字体
  20. 人生苦短,我用 Python,如何学习 Python 网络爬虫?

热门文章

  1. shell脚本编程规范与变量
  2. 程序员利用Python破解老婆撤回的消息,这样竟然还有老婆?
  3. ***解决UEditor编辑器无法插入第三方视频地址
  4. OpenFileDialog对话框Filter属性
  5. linux基础入门概念
  6. 结对编程-黄金点游戏
  7. 如何检查CentOS服务器受到DDOS攻击
  8. 微服务采用何种远程调用方式?
  9. Django学习笔记2
  10. D. Mahmoud and Ehab and the binary string Codeforces Round #435 (Div. 2)