angular - NgRx 效果与 RxJS 运算符相结合
问题描述
有谁知道为什么switchMap
操作员不工作?
我试图map
改用第二个操作员并且它有效,但我不明白为什么switchMap
不工作。
@Injectable()
export class PizzasEffects {
constructor(private actions: Actions, private pizzasService: PizzasService) {}
@Effect()
createPizzaSuccess$ = this.actions.ofType( fromPizzasActions.CREATE_PIZZA_SUCCESS ).pipe(
map( (action: fromPizzasActions.CreatePizzaSuccess) => action.payload ),
switchMap( (pizza: Pizza) => new fromRouterActions.Go({path: ['products', pizza.id]}) )
);
}
解决方案
使用简单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
. 例如,要返回 a 的结果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]})
])
);
更多解释:
推荐阅读
- javascript - Microsoft Bot 的自动测试
- python - 如何从python3中的文本文件更新变量
- linux - printf 从左边填充除零以外的数字
- angular - Angular - 使用 Mat 表处理表单数组
- html - -webkit-overflow-scrolling 的 Zindex 问题:触摸;在野生动物园
- javascript - 使用 react-date-range 的日历组件时如何修复错误
- json - 如何在邮递员中添加 -d JSONString='{}
- c++ - 错误:构造函数委托给自身问题
- ios - 内核函数
- docker - Docker 需要 /var/lib 777 权限