#rxjs #observable
#rxjs #наблюдаемый
Вопрос:
Помню, когда-то давно я нашел рекомендацию избегать любого кода в subscribe
методе и вместо этого использовать каналы.
// suppose bad
observable.subscribe(() => dosmg())
// suppose good
observable
.pipe(tap(() => dosmg()))
.subscribe()
Рассуждения были связаны с дрожанием дерева. Второй вариант, предложенный для лучшей оптимизации. В настоящее время я больше не могу найти эту рекомендацию, а также противоположную рекомендацию. И множество учебных материалов, с которыми я столкнулся, добавляют код в subscribe
метод без объяснений. По-прежнему рекомендуется использовать каналы вместо кода в subscribe
?
Комментарии:
1. Лучший способ — поместить код внутрь
subscribe
.2. Я обычно помещаю код в subscribe, если у меня всего до 10 строк кода. Больше, чем это, и он выделяется в отдельный метод для удобства чтения.
3. Мне кажется, лучше не помещать свой код внутри subscribe, для лучшей цепочки и повторного использования вашего кода.
4. Нет, определенно нет. Вы должны думать о
subscribe
как «выполнить эту цепочку сейчас». Например, вtap
следует ввести бизнес-логику.5. @ritaj ваше предложение в основном противоположно тому, что представляет rxjs.
Ответ №1:
Обычно я избегаю указывать логику в subscribe .
Прелесть функционального кодирования в том, что вы можете комбинировать, архивировать, объединять и расширять свои наблюдаемые объекты.
Если вы добавляете логику в subscribe, это просто теряет переносимость и усложняет рефакторинг на более позднем этапе. Вот типичный сценарий объединения потоков
const stream1=observable
.pipe(tap(() => dosmg()))
const stream1WithLoggin=stream1.pipe(tap(message=>console.log(message))
const stream1WithHttp=stream1.pipe(mergeMap(message=>fetch(someurl))
Комментарии:
1. «Если вы добавляете логику в subscribe, это просто теряет переносимость» Почему?
2. То, что возвращается из subscribe, — это подписка, которая больше не может быть продлена или передана по каналу для дальнейшего использования
3. Это не объясняет _»потерю переносимости»_.
4. Тогда зачем вам нужен operator, если вы хотите поместить логику в subscribe? оператор предназначен для того, чтобы помочь вам управлять вашей логикой, нет?
5. «должен ли я также показать, почему добавление чего-либо в subscribe() мешает вам в дальнейшем создавать функцию?» Да, потому что подписка на
observable
не мешает вам создавать на его основе любой другой поток. «точка подписки заключается в выполнении функции» .subscribe
создает наблюдателя внутри, даже если вы ничего не передаете. Данные из потока всегда используются наблюдателем. В этом и заключается суть шаблона observer.