【发布时间】:2017-09-05 15:54:52
【问题描述】:
我一直在切换 observables。这里有一个条件:第一个 observable 应该总是发出并作为主值流处理,第二个 observable 应该产生 void 值,然后它会作为副作用处理。
我对不同的组合运算符感到非常困惑。现在我留在 concatMap 但它也不能正常工作。
window.onload = function() {
const { Observable } = Rx;
const one = document.getElementById('one');
const two = document.getElementById('two');
const one$ = Observable
.fromEvent(one, 'click')
.map(() => [1,2,3,4]);
const two$ = Observable
.fromEvent(two, 'click')
.map(() => void 0);
const sideEffect = values => console.log('Doing something with data', values);
one$
.concatMap(initialValues => two$
.do(() => sideEffect(initialValues))
.map(() => initialValues))
.subscribe(x => alert(JSON.stringify(x, null, 2)))
}
<script src="https://unpkg.com/@reactivex/rxjs@5.0.3/dist/global/Rx.js"></script>
<button id="one">One</button>
<button id="two">Two</button>
【问题讨论】:
-
在我看来,在这种情况下,您可能希望有 2 个单独的订阅,每个订阅对应一个 observable。否则,您将不得不添加逻辑来延迟从每个 observable 返回的值。
-
你能解释一下你试图解决的问题吗?看起来您希望第二个 observable 从第一个修改数据。如何?在您的示例中,您似乎在第二个 observable 发生时添加了
b属性。它应该修改它之后的值吗?还是应该修改之前的值? -
@BenjiLees 两个订阅不适合我的情况。在
two$发出后,我需要根据one$的最后一个值产生副作用 -
@Pace 我已经非常简化了这个问题,因为真正的 Observable 链足够大。在现实世界中,它处理多个 DOM 事件和
Subjects。当第二个 observable 发生时,我添加属性b例如副作用。我想我需要改变这部分
标签: javascript rxjs observable rxjs5