结合Observables - 等待所有可观察者发射

时间:2017-01-03 21:20:53

标签: javascript node.js rxjs5

我有这段代码:

let $obs = Rx.Observable.merge(
    this.obsEnqueue,
    Rx.Observable.timer(2000)
);

但这并不是我想要的 - 我想要做的就是等到两个事件都发生(来自this.obsEnqueue的事件和来自Rx.Observable.timer()的事件)。

merge很可能会创建一个新的Observable,它将在传入所有可观察对象的第一个事件时触发。我想创建一个新的observable,它将在所有可观察的传入被触发后触发。

更一般地说:

let $obs = Rx.Observable.X(
    Rx.Observable,    // wait
    Rx.Observable,    // until
    Rx.Observable,    // all of these
    ...
    Rx.Observable     // fire the next event
);

我该怎么做?什么是X?

2 个答案:

答案 0 :(得分:4)

如果您希望在到达时合并所有结果,则可以使用zip



const { Observable } = Rx;

const result = Observable.zip(
  Observable.of('data1'),
  Observable.of(true).delay(500),
  Observable.timer(1000)
);

result.forEach(console.log); // after 1000ms: ['data1', true, 0]

<script src="https://cdnjs.cloudflare.com/ajax/libs/rxjs/5.0.1/Rx.min.js"></script>
&#13;
&#13;
&#13;

答案 1 :(得分:1)

您可以使用forkJoin

Rx.Observable.forkJoin(
  Rx.Observable.of('hello').delay(2000),
  Rx.Observable.of('world').delay(1000)
)
  .subscribe(console.log)

两秒后你应该有一个['hello', 'world']的数组。输出的顺序与参数输入的顺序相同。

输入可以是多个参数,数组和其他内容:

  

从Array,类似数组的对象,Promise,可迭代对象或类似Observable的对象创建Observable。

这是一个Fiddle来测试它(只需调出控制台)。