命令和查询提供了一种强大且简化的方式来处理状态(换句话说,加载和缓存),并针对后端系统执行操作。 这类似于 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 });
}
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。