Прокси наблюдаемый и подключите его в обратном вызове - PullRequest
0 голосов
/ 25 мая 2018

Я пытаюсь вернуть Observable, который создается асинхронно в обратном вызове:

const mkAsync = (observer, delay) =>
  setTimeout(() => Observable.of('some result').subscribe(observer), delay)

const create = arg => {
  const ret = new Subject()
  mkAsync(ret, arg)
  return ret
}

Поэтому я использую Subject в качестве одноадресного прокси, который подписан на базовый Observableв обратном вызове.

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

IЯ должен оставить mkAsync пустым и ищу альтернативную реализацию.

Это правильный способ сделать это?Есть ли альтернативное решение для использования Subject?

Как мне убедиться, что созданный Observable отменен (unsubscribe вызывается на Subscription), когда субъект отписался от подписки?

1 Ответ

0 голосов
/ 25 мая 2018

Это довольно широкий вопрос, и трудно сказать, чего вы пытаетесь достичь с помощью этого.У меня есть две идеи:

Во-первых, существует оператор refCount(), который существует только в классе ConnectableObservable, который возвращается из multicast (или publish) в зависимости от параметров, которые вы передаете.См. Реализацию для более подробной информации (в основном, если вы не установили selector функцию): https://github.com/ReactiveX/rxjs/blob/5.5.11/src/operators/multicast.ts

Вторая проблема, о которой я могу подумать, заключается в том, что вы делаете в основном это:

const ret = new Subject()
Observable.of(...).subscribe(ret);

Проблема в том, что .of немедленно издает свои элементы next, а затем отправляет уведомление complete.Субъекты имеют внутреннее состояние, и когда Subject получает уведомление complete, оно помечается как stopped и , оно никогда не излучает ничего .

Я подозреваю, что это происходит свы.Даже если вы вернете экземпляр Subject с return ret и, возможно, позже подпишетесь на него, вы все равно ничего не получите, потому что этот субъект уже получил уведомление complete.

...