Подтвердить что ты не робот

Как получить "текущее" значение наблюдателя во время подписки

Мне тяжело громить одну из частей RxJs: когда вы подписываетесь на Observable, вы подписываетесь только на любые будущие события из этого потока. Сравните с Promises, где, если обещание будет разрешено, вы получите это значение независимо от того, когда вы вызываете then().

Вот пример кода:

var subject = new Rx.Subject();

subject.onNext('old value');
subject.onNext('before subscription');

subject.subscribe(function(val) {
  document.write(val);
});

subject.onNext('after subscription');
<script src="https://cdnjs.cloudflare.com/ajax/libs/rxjs/2.3.24/rx.all.js"></script>
4b9b3361

Ответ 1

Rx предлагает оба поведения (как и другие).

различные объекты Rx могут позволить вам исследовать различные способы, с помощью которых можно наблюдать наблюдаемые:

  • Rx.Subject - это самый простой вариант с огнем и забытьем - если вы не были подписаны, когда произошло событие, вы его не увидите.

  • Используйте new Rx.BehaviorSubject(undefined) вместо Subject, и вы получите поведение, которое вы искали, поскольку BehaviorSubject представляет "значение, которое может меняться"

  • Используйте new Rx.ReplaySubject(5), и вы получите 5 самых последних значений сразу после подписания

  • Используйте new Rx.AsyncSubject(), и вы ничего не получите до тех пор, пока наблюдаемое не завершится, и в это время вы получите окончательное значение (и продолжите получать окончательное значение, если вы снова подписались). Это истинный Rx-аналог Promises, поскольку он ничего не производит, пока не "разрешится" (т.е. Не завершится), а затем всегда дает значение любому, кто подписывается.