likes
comments
collection

SAP Spartacus 中的 Commands and queries

作者站长头像
站长
· 阅读数 8

命令和查询提供了一种强大且简化的方式来处理状态(换句话说,加载和缓存),并针对后端系统执行操作。 这类似于 React Query 和 SWR 等库在单页应用程序中处理来自 API 的状态问题的方式。 前端应用状态很大一部分来自后端。 经常用于状态管理的 Redux 架构在创建时并未考虑到这种类型的状态,并且需要大量样板来支持它。 不同类型的状态需要不同的解决方案,并且命令和查询旨在处理来自 Spartacus 中的 API 的状态。 在很多情况下,命令和查询将取代默认 Spartacus 库的 NgRx,并使大多数实现更简单,具有更好、更一致的错误处理,同时还利用 Spartacus 事件框架。

什么是 command

命令表示可以更改系统状态的操作,通常通过向后端发出 REST 调用。 命令可以返回结果,并且可以在考虑执行策略的同时执行。 每个命令执行都会返回一个 observable,它会发出(带有可选的成功结果),然后在命令完成时完成,或者在命令执行导致错误时抛出错误。

订阅结果 observable 并不能确定命令的执行,因此它是可选的。、

command definition

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

命令具有以下参数:

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

下面是一个例子:

  protected updateCommand: Command<{ details: User }> = this.command.create(
    (payload) =>
      this.userIdService.takeUserId(true).pipe(
        switchMap((uid) =>
          this.userProfileConnector.update(uid, payload.details)
      ),
    {
      strategy: CommandStrategy.Queue,
    }
  );
  • Parallel 并行执行所有命令。
  • Queue 将命令排队并按顺序执行(这是默认策略)。
  • CancelPrevious 开始新的命令执行,如果尚未完成则取消上一次执行(上一次执行的结果流将在不发射的情况下完成)。
  • ErrorPrevious 开始新的命令执行,如果尚未完成,则为上一个命令引发错误(上一次执行的结果流将引发错误)。

Exposing Commands in Facade Services

命令旨在公开为调用可以在命令类上执行的方法,并返回可观察的结果。 如前所述,调用可以简单地调用一个方法来执行命令。 订阅结果是可选的。 下面是一个例子:

  update(details: User): Observable<unknown> {
    return this.updateCommand.execute({ details });
  }