Используя модуль сохранения данных в 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
        }))
      );
    }
Другие вопросы по тегам