Наблюдаемая лучшая практика

#angular #rxjs #rxjs-pipeable-operators

#angular #rxjs #rxjs-конвейерные операторы

Вопрос:

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

Я вижу два способа сделать это, либо напрямую подписавшись на мой observable, либо используя pipable operator.

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

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

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

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

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

Комментарии:

1. Я думаю, что ЭТО не то место, чтобы спрашивать об этом. Попробуйте здесь: codereview.stackexchange.com

2. Учитывая, что первое проще, почему бы вам рассмотреть второе? Если вам действительно не нужно применять какое-либо преобразование, карта является избыточной.

3. Первый из них правильный. map используется для сопоставления одного значения с другим, которое возвращается из его обратного вызова, и оно не должно вызывать никаких побочных эффектов.

4. поскольку наблюдаемые объекты ленивы — они не запускаются до тех пор, пока не подписаны, — поэтому вы должны использовать .subscribe для выполнения некоторых действий

Ответ №1:

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

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

Комментарии:

1. this.myValue = value; это буквально побочный эффект. Рекомендуется использовать tap .

Ответ №2:

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

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

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

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

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