Когда вы создаете наблюдаемую с помощью операторов конвейера, например:
const source = of(42);
const composed = source.pipe(
map(value => (6 * 9) - value)
);
composed.subscribe(value => console.log(value));
, там будет введена наблюдаемая для каждого оператора.
Здесь вызывающая сторона подписывается на сопоставленную наблюдаемую иэта сопоставленная наблюдаемая подписывается на источник.
Когда подписчик подписывается, передается только обработчик next
.То есть вызывающая сторона не передает экземпляр Subscriber
- поэтому для его создания необходим toSubscriber
.Однако когда отображаемая наблюдаемая подписывается на источник, она делает это, передавая map
оператора MapSubscriber
.Вы можете увидеть вызов subscribe
made здесь .
MapSubscriber
расширяет Subscriber
, поэтому нет необходимости в toSubscriber
для создания другого;он может просто вернуть MapSubscriber
, который он получил.
rxSubscriberSymbol
- это Symbol
, который используется для идентификации Subscriber
и Subject
экземпляров.
В версии 5RxJS, этот символ был объявлен с использованием Symbol.for
- см. здесь - что означало, что один и тот же символ был бы общим для разных копий или версий RxJS.И символ разрешил взаимодействие между копиями или версиями - Subscribers
из одной копии не нужно будет оборачивать другой.
В версии 6, однако, символ объявляется с использованием Symbol
- см. здесь .Это означает, что он по сути является закрытым, поскольку каждая копия или версия RxJS получит уникальный символ и не может выполнять роль взаимодействия.
rxSubscriberSymbol
используется в Subscriber
и в Subject
, нотеперь, когда это частный символ, он больше не служит цели, и мне кажется, что он не нужен:
- Его использование в
Subscriber
не является обязательным, поскольку проверка instanceof Subscriber
идентифицирует Subscriber
экземпляров. - И его использование в
Subject
не является необходимым, поскольку свойство rxSubscriberSymbol
в Subject
- см. здесь - не делает ничего, кроме переноса Subject
в Subscriber
- это то, что произошло бы в toSubscriber
без чека.