Вся твоя жизнь была ложью

На протяжении всей нашей карьеры большинство из нас учили составлять набор инструкций и выполнять работу. Он был в основном сосредоточен на «КАК», а не на «ЧТО», и это имеет смысл, а также очень важно узнать, как вы решаете что-то, и мы можем овладеть навыками. написать то же самое лучше на следующем уровне. Когда я говорю «написать лучше», я имею в виду возложение минимальной когнитивной нагрузки на следующего разработчика, работающего над этим. Упрощение для следующего разработчика (и вас в будущем), чтобы понять, что происходит (что делает этот фрагмент кода).

Постановка проблемы

  • Визуализация списка пользователей, полученного из API
  • Возможность добавить нового пользователя (имя, фамилия и адрес электронной почты)
  • Возможность обновить существующего пользователя
  • Возможность удалить существующего пользователя

Реактивное первое мышление

Думая с точки зрения действий и состояний, которые нужны вашему компоненту, где все является переменной (наблюдаемый поток), которую можно рассматривать как функцию некоторых дельт, и эти дельты (которые снова являются некоторыми потоками) могут быть объединены вместе с использованием операторов RxJs в соответствии с отношение или зависимость, которые у них есть. (Например, sum$ = fn (delta1$, delta2$))

Действия

// fire this to add a new user
addUserAction$$ = new Subject<IUser>();
// fire this to delete a user
deleteUserAction$$ = new Subject<IUser>();
// fire this update a user
updateUserAction$$ = new Subject<IUser>();

Участники поиска данных

private fetchedUsers$ = this.http
    .get<IUser[]>('api/users');

private addUser(user: IUser) {
  return this.http.post<IUser>('api/users', user)
    .pipe(map(() => user));
}

private deleteUser(user: IUser) {
  return this.http
    .delete<IUser>(`api/users/${user.id}`)
    .pipe(map(() => user));
}

private updateUser(updatedUser: IUser) {
  return this.http
    .put<IUser>(`api/users/${updatedUser.id}`, updatedUser)
    .pipe(map(() => updatedUser));
}

Пользовательские события

private userAdded$ = this.addUserAction$$.pipe(
  switchMap((userToBeAdded) => this.addUser(userToBeAdded))
);

private userUpdated$ = this.updateUserAction$$.pipe(
  switchMap((userToBeUpdated) => this.updateUser(userToBeUpdated))
);

private userDeleted$ = this.deleteUserAction$$.pipe(
  switchMap((userToBeDeleted) => this.deleteUser(userToBeDeleted))
);

Здесь каждое пользовательское событие — это функция триггерного действия и вызова API. Например: userAdded$ — это fn(addUserAction$$, addUserAPIRequest), а switchMap (оператор RxJs) используется для поддержки зависимости между этими двумя дельтами для формирования базового состояния userAdded$.

userEvent$ = merge(this.userAdded$, this.userUpdated$, this.userDeleted$);

Любое из этих событий срабатывает, userList$нужно обновить, поскольку userList$ является функцией (зависимостью) между fetchedUsers$ и userEvent$

userList$ = this.userEvent$.pipe(
    startWith(null),
    switchMap(() => this.fetchedUsers$)
);

Вот ссылка на полную демо👇



Я придумаю больше сценариев, чтобы охватить тот же реактивный подход, ваша оценка определенно будет мотивировать. Спасибо!😊