Ниже приведен краткий фрагмент кода реактивного кода (RxJs
)RxJs Наблюдаемое завершает несколько раз
let subj = new Rx.Subject();
let chain = subj
.switchMap(v => Rx.Observable.of(10*v).do(vv => console.log("Switch map", vv)))
.share()
.take(1);
function subscribe(){
chain.subscribe(v => console.log("Next", v),
err => console.log("Error",err),
() => console.log("Completed"));
chain.subscribe(v => console.log("Next2", v),
err => console.log("Error2",err),
() => console.log("Completed2"));
subj.next(Math.random());
}
subscribe();
subscribe();
subscribe();
<script src="https://unpkg.com/rxjs/bundles/Rx.min.js"></script>
В соответствии с documentationchain
является Observable
, который должен печатать излучаемый значение * 10 (switchMap), при печати только один раз, независимо от того, сколько у него подписчиков (share), сделайте это только для первого испущенного значения, а затем заполните.
Первые две пули работают нормально, но последний не работает. Вот результат я получаю:
Switch map 9.022491050934722
Next 9.022491050934722
Completed
Next2 9.022491050934722
Completed2
Switch map 9.172999425126836
Next 9.172999425126836
Completed
Next2 9.172999425126836
Completed2
Switch map 6.168790337405257
Next 6.168790337405257
Completed
Next2 6.168790337405257
Completed2
Как вы можете видеть, chain
становится завершенные несколько раз.
Что позволяет заполнить одно и то же значение Observable
несколько раз?
Так вы говорите, что каждый ' Наблюдаемый', который возвращается из 'share', сбрасывается и переоценивается после его завершения? – meltedspark
Не автоматически, но как только появляется новый подписчик. – olsn
Хорошо, это объясняет вещи. Имейте это в документации. Я не получил часть 'take' after' share'. Можете ли вы подробно рассказать? – meltedspark