命令和查詢提供了一種強大且簡化的方式來處理狀態(換句話說,載入和快取),並針對後端系統執行操作。 這類似於 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 });
}