Используя модуль сохранения данных в Nx от Nrwl, чем отличается реализация пессимистического обновления от оптимистического обновления - PullRequest
0 голосов
/ 29 ноября 2018

Мы находимся в процессе принятия платформы 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, пролить свет на разницу, а также на то, чтонам нужно реализовать в нашем сервисе оптимистичное обновление.

1 Ответ

0 голосов
/ 07 декабря 2018

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
        }))
      );
    }
...