В RxJS Зачем проверять rxSubscriberSymbol в toSubscriber? - PullRequest
0 голосов
/ 02 февраля 2019

Я прочитал некоторые части ReactiveX codebase несколько раз и до сих пор не могу точно описать, что происходит здесь , в toSubscribe.ts:

if (nextOrObserver) {
  if (nextOrObserver instanceof Subscriber) {
    return (<Subscriber<T>> nextOrObserver);
  }

  if (nextOrObserver[rxSubscriberSymbol]) {
    return nextOrObserver[rxSubscriberSymbol]();
  }
}

Что я знаю

Я знаю, Observable.subscribe принимает переданного наблюдателя (который может быть в различных формах) и через toSubscribe.ts преобразует наблюдателя вSubscriber объект.Новый объект Subscriber будет иметь экземпляр SafeSubscriber в свойстве Subscriber.destination.

Этот сегмент из Subscriber.ts класса также относится к следующему вопросу:

[rxSubscriberSymbol]() { return this; }

В приведенном выше коде свойство rxSubscriberSymbol Symbol возвращает сам экземпляр класса.

Мой вопрос

Я получаю toSubscriber должен проверить, является ли наблюдатель уже Subscriber.Ну, я не совсем уверен , когда toSubscribe будет вызван с наблюдателем, который уже a Subscriber, но я предполагаю, что бывают случаи, когда это происходит.

Почему необходимо проверять обоих , является ли наблюдатель экземпляром Subscriber и , существует ли свойство rxSubscriberSymbol Symbol?Насколько я могу судить, если экземпляр является экземпляром Subscriber, он всегда имеет свойство rxSubscriberSymbol Symbol, и наоборот.

1 Ответ

0 голосов
/ 02 февраля 2019

Когда вы создаете наблюдаемую с помощью операторов конвейера, например:

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 без чека.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...