Я пишу это, чтобы знать, правильно я понял или нет.
В примерах, найденных в Интернете, шаблон обычно выглядит следующим образом (здесь пример действий по добавлению / удалению в состоянии и в удаленной базе данных):
эффекты.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 }))
reducer.ts
...
switch (action.type){
case 'ADD_SUCCESS':
...
return new_state;
case 'ADD_FAIL':
return state;
}
Это работает, но скорость выполнения, которую ощущает пользователь, зависит от скорости сети. Поэтому я придумал шаблон, который делает ставку на высокую вероятность того, что API не вернет ошибку:
reducer.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 возвращает ошибку, выполняется второе действие для отмены первого действия.
Но я еще не нашел этот дизайн в примерах, приведенных в Интернете: поскольку я начинающий разработчик, мне интересно, не пропустил ли я что-то, что в конечном итоге делает его неправильным / опасным / неэффективным.