Ниже приведен короткий фрагмент реактивного кода (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>
Согласно документации chain
это 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
несколько раз?