【问题标题】:Combining two parallel observables结合两个并行的 observables
【发布时间】: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


【解决方案1】:

如果$two 需要修改$one 的最后一个值,然后发出修改后的值,您可以创建一个行为主体。

  const values$ = new BehaviorSubject();
  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$.subscribe(values => {
    values$.next(values);
  });
  two$.subscribe(() => {
    let currentValue = values$.value;
    let modifiedValue = sideEffect(currentValue);
    values$.next(modifiedValue);
  });

  values$.subscribe(x => alert(JSON.stringify(x, null, 2)))

【讨论】:

  • 感谢您的回答
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-01-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-09-01
  • 1970-01-01
相关资源
最近更新 更多