Есть ли способ иметь горячий наблюдаемый от EventEmitter
(или эквивалент, доступный в Angular 2 alpha 46/RxJS 5 alpha)? то есть , если мы подписываемся после того, как значение будет разрешено, оно инициирует с ранее разрешенным значением. Подобно тому, что мы имеем, когда всегда возвращаем одно и то же обещание.Горячая и общая информация Наблюдаемая с EventEmitter
В идеале, только с использованием объектов Angular 2 (я прочитал где-то светлый RxJS, который будет встроен позже, чтобы удалить зависимость), в противном случае импорт RxJS в порядке. AsyncSubject, похоже, соответствует моей потребности, но он недоступен в RxJS 5 alpha.
Я пробовал следующее, без успеха (никогда не срабатывает). Любая идея о том, как его использовать?
let emitter = new EventEmitter<MyObj>();
setTimeout(() => {emitter.next(new MyObj());});
this.observable = emitter;
return this.observable.share();
Full plunker here comparing hot and cold
USECASE: достичь некоторые асинхронных объекты только один раз (например, серия HTTP вызовов слита/завернутой в нового EventEmitter
), но обеспечивают разрешенный объект асинхронного к любой услуге/компонент, подписавшийся на него, даже если они подписываются после его разрешения (получены ответы HTTP).
EDIT: вопрос не в том, как объединить ответы HTTP, но как получить (горячий?) Наблюдаемый от EventEmitter или любой эквивалент, доступный с альфа-альфа-альфа-46/RxJS 5, который позволяет подписываться после асинхронизации результат получается/разрешен (HTTP - всего лишь пример асинхронного происхождения). myEventEmitter.share() не работает (cf plunker выше), хотя он работает с Observable, возвращаемым HTTP (cf plunker from @ Eric Martinez). И что касается метода Angular 2 alpha 46, .toRx() больше не существует, EventEmitter является наблюдаемым и субъектом.
Это то, что хорошо работает с обещаниями, пока мы всегда возвращаем один и тот же объект обещания. Поскольку у нас есть наблюдатели, представленные с помощью услуг HTTP Angular 2, я хотел бы избежать смешивания обещаний и наблюдателей (и, как говорят, наблюдатели более сильны, чем обещания, поэтому он должен позволять делать то, что легко с обещаниями).
Specs about share() (Я не нашел doc для версии 5 alpha - версия, используемая Angular 2) - работает на Observable
, возвращенной службой HTTP с угловым 2, не работая над EventEmitter.
EDIT: разъяснено, почему не использовать Observable, возвращаемое HTTP, и добавил, что не использовать RxJS напрямую было бы еще лучше.
EDIT: изменено описание: проблема связана с несколькими подписками, а не с объединением результатов HTTP.
Спасибо!
У меня есть пример http, использующего share в этом [plnkr] (http://plnkr.co/edit/GFdXPncYPxx0IcqIwQnO?p=info). Почему вы спрашиваете о преобразовании EventEmitter в нечто такое, когда ваш usecase использует модуль Http? –
В моем описании вводящий в заблуждение, usecase немного сложнее: серия HTTP-вызовов, и после завершения я объединять/обертывать результаты в новом Observable. Эквивалент обещаний (синтаксис углового 1): 'return $ q.all (httpPromisesToResolve);' – Antoine
Я не думаю, что для этого вам понадобится 'share()'. Вам нужно ['flatMap'] (https://github.com/Reactive-Extensions/RxJS/blob/master/doc/api/core/operators/selectmany.md). Проверьте это [пример] (http://plnkr.co/edit/9sPNlaNLh7Aie9yH1H7i?p = preview) –