Используйте просто оператор map
вместо switchMap
, как показано ниже:
@Effect()
createPizzaSuccess$ = this.actions.ofType(fromPizzasActions.CREATE_PIZZA_SUCCESS).pipe(
map(action => action.payload),
map(pizza => new fromRouterActions.Go({path: ['products', pizza.id]}))
);
switchMap
оператор ожидает Observable
. Например, чтобы вернуть результат HttpClient.get
:
@Effect()
createPizzaSuccess$ = this.actions.ofType(fromPizzasActions.CREATE_PIZZA_SUCCESS).pipe(
map(action => action.payload),
switchMap(pizza => this.httpClient.get(URL))
);
Но в вашем случае значение, которое выдается, это всего лишь Action
, поэтому оператор map
является правильным выбором, точно так же, как вы это сделали извлечь payload
из action
.
Также обратите внимание, что switchMap
ожидает поток, и вы можете предоставить Observable, Promise, Array или Iterable.
Это означает, в случае NgRx
в некоторых ситуациях может быть полезно вернуть несколько действий для одного effect
, поэтому массив действий:
@Effect()
createPizzaSuccess$ = this.actions.ofType(fromPizzasActions.CREATE_PIZZA_SUCCESS).pipe(
map(action => action.payload),
switchMap(pizza => [
new fromUIActions.showNotification({ message: 'Pizza loaded' }),
new fromRouterActions.Go({path: ['products', pizza.id]})
])
);
Дополнительные пояснения: