Используя модуль сохранения данных в Nx от Nrwl, чем отличается реализация пессимистичного обновления от оптимистического обновления
Мы находимся в процессе принятия платформы Nx от Nrwl.io для наших приложений Angular.
В рамках этого мы пытаемся понять основные различия в реализации между методами optimisticUpdate и pessimisticUpdate в модуле сохранения данных.
Согласно документации, pessimisticUpdate обновит сервер раньше клиента, а с помощью optimisticUpdate клиент обновляется первым.
Однако исходный код на github для обоих методов выглядит следующим образом
export function pessimisticUpdate<T, A extends Action>(
opts: PessimisticUpdateOpts<T, A>
) {
return (source: ActionStateStream<T, A>): Observable<Action> => {
return source.pipe(
mapActionAndState(),
concatMap(runWithErrorHandling(opts.run, opts.onError))
);
};
}
export function optimisticUpdate<T, A extends Action>(
opts: OptimisticUpdateOpts<T, A>
) {
return (source: ActionStateStream<T, A>): Observable<Action> => {
return source.pipe(
mapActionAndState(),
concatMap(runWithErrorHandling(opts.run, opts.undoAction))
);
};
}
На первый взгляд, разделение обновлений на оптимистические и пессимистичные кажется очень полезным, но, по сути, реализация обоих методов кажется идентичной, и мы пытаемся понять, что значит использовать оба метода.
Кроме того, пример кода для вызова метода optimisticUpdate не отправляет действие, если метод run успешно завершен. Насколько я понимаю, это закончило бы поток - нет никаких указаний на то, что должен возвращать внутренний вызов.
class TodoEffects {
@Effect() updateTodo = this.s.optimisticUpdate('UPDATE_TODO', {
// provides an action and the current state of the store
run: (a: UpdateTodo, state: TodosState) => {
return this.backend(state.user, a.payload);
},
undoAction: (a: UpdateTodo, e: any) => {
// dispatch an undo action to undo the changes in the client state
return ({
type: 'UNDO_UPDATE_TODO',
payload: a
});
}
});
Может ли кто-нибудь, кто использовал Nx, пролить свет на то, в чем разница, а также на то, что нам нужно сделать, чтобы внедрить в наш сервис оптимистичное обновление.
0 ответов
Nx поставляется с двумя версиями: RxJs pipeable operator
версия и член класса DataPersistence.
Первому нужен Observable to pipe, который вы должны предоставить (это функции, которые вы нашли в первом блоке кода). Последний выглядит как ваш второй блок кода.
Разница между оптимистическим и пессимистическим в том смысле, что он реализован, заключается лишь в том, что существует возможность отката оптимистического обновления (предоставляется undoAction
). Это связано с тем, что при оптимистическом вызове мы немедленно обновляем интерфейс и отправляем сетевой вызов для обновления сервера. Если серверный вызов не выполнен, нам нужно откатить то изменение пользовательского интерфейса, которое мы сделали. Это не будет применяться в пессимистическом вызове, потому что у нас был бы загрузочный счетчик или другой механизм, чтобы избежать обновления пользовательского интерфейса, пока вызов находится в полете.
Для вашего второго блока кода run
функция не возвращает действие. Это должно быть обновлено в документах Nx.
class TodoEffects {
@Effect() updateTodo = this.s.optimisticUpdate('UPDATE_TODO', {
run: (a: UpdateTodo, state: TodosState) => {
return this.backend(state.user, a.payload)
.pipe(
map(resp => ({
type: 'UPDATE_TODO_SUCCESS',
payload: resp
}))
);
}