Spartacus 使用 Command 设计模式之后对以前 Connector 实现的重用

举报
Jerry Wang 发表于 2023/03/01 10:39:52 2023/03/01
【摘要】 Command 设计模式提供了一种强大且简化的方式来处理状态(换句话说,加载和缓存),并针对后端系统执行操作,比如 Spartacus Storefront B2B 场景下设置 Payment Method,即切换下图所示的 Radio button,对应的后台实现就通过 Command 方式触发一个发送到 Commerce Cloud 后台的 HTTP PUT OCC 请求。Command...

Command 设计模式提供了一种强大且简化的方式来处理状态(换句话说,加载和缓存),并针对后端系统执行操作,比如 Spartacus Storefront B2B 场景下设置 Payment Method,即切换下图所示的 Radio button,对应的后台实现就通过 Command 方式触发一个发送到 Commerce Cloud 后台的 HTTP PUT OCC 请求。

Command 表示一种可以更改系统状态的操作,通常是通过向后端发出 REST 调用来完成。想想上图 Spartacus 的例子,如何找到该 Command 对应的 OCC 请求准确的发起位置?还有 Connector 参与吗?

把鼠标移到 network 标签页的 Initiator 栏,查看函数调用列表。乍一看,我们在 Spartacus B2B Storefront 发起的 OCC API 请求里,看不到 connector 的参与了?

checkoutPaymentTypeFacade 定义在 checkout/b2b 的 root 文件夹之下:

core 文件夹下的 service 实现了这个 facade:

通过存储 CommandService.create 工厂方法调用的结果,可以将命令实例定义为类的属性。

创建命令的工厂函数里,具有以下参数:

(1) 调度命令的函数(通常是对连接器的调用)
(2) 一个选项对象(通常用于指定策略)

上图 command 创建时,传入的调度函数第 60 行,就是 paymentTypeConnector 的连接器调用:

connector 调用 adapter:

adapter 调用 HTTP client 的标准 put 方法:

工厂函数的第二个参数是 Command 的 Strategy,有下列四种选择:

  • Parallel 并行执行所有命令。
  • Queue 将命令排队并按顺序执行,这是默认策略。
  • CancelPrevious 开始新的命令执行并取消前一个命令,如果它尚未完成。此时前一个执行的结果流将完成而不会发出,可以类比 RxJs 的 SwitchMap Operator.
  • ErrorPrevious 开始新的命令执行,如果前一个命令尚未完成则抛出错误(前一次执行的结果流将抛出错误)。
【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。