我写这篇文章是为了知道我是否做对了。
在网上找到的例子中,模式通常是这样的(这里的例子是在状态和远程数据库上添加/删除操作):
效果.ts:
@Effect()
add$ = this.action$
.ofType(ADD)
.switchMap((action: Action) => {
return this.http.put(...)
.map( response => response.json() )
.map( response => Observable.of({ type: ADD_SUCCESS, payload: action.payload }))
.catch( response => Observable.of({ type: ADD_FAIL, payload: response.status }))
减速器.ts
...
switch (action.type){
case 'ADD_SUCCESS':
...
return new_state;
case 'ADD_FAIL':
return state;
}
它可以工作,但用户感受到的执行速度取决于网络的速度。因此,我想出了一个模式,押注 API 不会返回错误的概率很高:
减速器.ts
...
switch (action.type){
case 'ADD':
... // make the adequate addition
return new_state;
case 'ADD_FAIL':
... // delete the addition previously made
return new_state;
}
效果.ts:
@Effect()
add$ = this.action$
.ofType(ADD)
.switchMap((action: Action) => {
return this.http.put(...)
.map( response => response.json() )
.catch( response => Observable.of({ type: ADD_FAIL, payload: action.payload }))
在这种模式下,保存到数据库的动作确实是一个“副作用”。在 API 返回错误的不太可能但可能的情况下,将采取第二个操作来撤消第一个操作。
但是我还没有在网上给出的例子中找到这个设计:因为我是一个业余开发者,我想知道我是否错过了一些最终使它出错/危险/低效的东西。