Наблюдаемая передовая практика

В моем текущем проекте у меня есть наблюдаемые возвращаемые значения, и я должен обновить свою локальную переменную в соответствии со значением, возвращаемым наблюдаемым.

Я вижу два способа сделать это: либо напрямую подписаться на мою наблюдаемую, либо с помощью оператора pipable.

Согласно вашему опыту/знаниям, что является наилучшей практикой?

1-й подход (прямая подписка):

this.myObservable$.subscribe(value=> {
  this.myValue = value;
});

2-й подход (с использованием оператора pipable):

this.myObservable$.pipe(
    tap(value=> this.myValue = value)
  ).subscribe();

person David ROSEY    schedule 24.04.2019    source источник
comment
Я думаю, что SO - неподходящее место, чтобы спрашивать об этом. Попробуйте здесь: codereview.stackexchange.com   -  person Sebastian Kaczmarek    schedule 24.04.2019
comment
Учитывая, что первое проще, зачем рассматривать второе? Если вам действительно не нужно применять какое-то преобразование, карта избыточна.   -  person jonrsharpe    schedule 24.04.2019
comment
Первый правильный. map используется для сопоставления одного значения с другим, которое возвращается из его обратного вызова, и оно не должно вызывать никаких побочных эффектов.   -  person martin    schedule 24.04.2019
comment
так как Observables ленивы - они не запускаются, пока не подписаны - поэтому вы должны использовать .subscribe для выполнения некоторых действий   -  person Alexander Poshtaruk    schedule 27.04.2019


Ответы (2)


Я думаю, что оба варианта допустимы, но в данном конкретном случае я бы использовал первый подход и выполнял работу в блоке подписки. Причина в том, что намерение более ясно.

«Tap» предназначен для выполнения побочных эффектов, но здесь вы не выполняете побочный эффект, поскольку после нажатия больше не происходит логики. Что вы делаете, так это используете развернутое конечное значение, чтобы что-то сделать, и именно для этого предназначен блок подписки.

person SnorreDan    schedule 24.04.2019
comment
this.myValue = value; буквально побочный эффект. Рекомендуется использовать tap. - person Roberto Zvjerković; 24.04.2019

Я рассматриваю возможность сделать это внутри pipe, если локальная переменная должна быть обязательно обновлена. У меня может быть несколько подписок на один и тот же наблюдаемый объект, и я могу забыть обновить локальную переменную в любой из них. Позаботиться об этом в Observable — это хорошо.

myOb$ = this.myObservable$.pipe(
    tap(value=> this.myValue = value)
)

Просто в вашем случае, если вы не делаете никаких изменений в Observable, вы можете использовать tap() вместо map()

Предположим, вы хотите обновить переменную класса, в котором Observable существует не там, где он подписан, тогда вы идете именно так. Скажем, Observable существует в сервисе, и несколько компонентов подписываются на него, после каждой эмиссии переменная сервиса должна обновляться.

Если локальная переменная принадлежит классу, подписавшемуся на Observable, то делать это внутри пайпа, конечно же, нет смысла.

person Ashish Ranjan    schedule 24.04.2019