пытаясь разложить этот капец на понятные слова:
1. of() / Observable() / pipe() - это всё конструкторы. Они создают новую "функцию", которая начинается фразой "открой источник данных", и замыкает в себе лютую кучу операций
2. метод subscribe() вопреки тому что многим кажется работает как .then() - не совсем. Сабскрайб создает одновременно два обьекта - подключение куда-то и подписку (возвращает только подписку), которая ждет следующую пачку данных. И вот если речь идет о пачке данных которая имеет начало и конец - то после завершения - подключение закрывается, в теории после выхода из функции обьект удалится и память очиститься - и получается что-то вроде then(). До момента пока бекендер не накосячит и не забудет передать заголовок закрывающий соединение. Если забудет - подписчик будет висеть вечно. А выполнив сотню сабскрайбов случайно в цикле - можно ушатать оперативку даже самого мощного компа.
3. pipe() в отличие от привычного на ноде "добавить обработчик" на самом деле создает чертеж того, как будем подключаться к источнику. то бишь на ноде "открыть файл асинхронно" все равно открывает файл. А пайпы к открытому файлу добавляют что делать с каждым чанком по мере чтения.
А тут пайп ничего не открывает, он только пакует, используя паттерн "билдер" указанные источники и способы их опрашивать в один большой чертеж, который потом будет вызван снова и снова. То есть пайп мы вроде написали, вернули откуда-то из логики, но никакой файл не открылся, а куда разместить код подписки - хороший вопрос, ивенты обычно лежат в единой папке, т.к. штука опасная и можно запутать всех коллег. А здесь ивенты начинают быть везде. Каждый запрос требует создать объект, который данные будет получать!
У промиза мы брали полученное, можно было ничего с ним не делать, оно все равно исчезало. А вот подписчик не исчезает никогда, пока ты не закроешь свою программу или не отпишешься. Ведь подписка хранит ссылку на сам поток и пока хоть одна ссылка есть - данные в памяти лежат вечно
Если офигенно надрючиться, то можно извлекать из этого пользу, но количество неочевидных ошибок по сравнению с работой с промизами будет больше на нолик справа.
отличный пример - делаем "сабжект", и чтобы узнать его значение - по привычке пишем subscribe() к нему. только вот сабжект - это бесконечное подключение. стоит пропихнуть туда что-то - и все подписчики обработаются еще раз. то есть операция "взять значение, валиднуть его и запихнуть назад" будет ломать мозги очень многим людям, т.к. взять и подписаться на будущее не одно и то же. а выглядит как будто так.