组合 Observables - 等待所有 observables 触发
Combining Observables - waiting till all observables fire
我有这个代码:
let $obs = Rx.Observable.merge(
this.obsEnqueue,
Rx.Observable.timer(2000)
);
但这不是我想要的 - 我想做的是等到两个事件都触发(来自 this.obsEnqueue
的事件和来自 Rx.Observable.timer()
的事件)。
merge
很可能会创建一个新的 Observable,当第一个事件发生时,所有的 observable 都被传入。我想创建一个新的 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 是什么?
你也许可以使用 forkJoin:
Rx.Observable.forkJoin(
Rx.Observable.of('hello').delay(2000),
Rx.Observable.of('world').delay(1000)
)
.subscribe(console.log)
两秒后你应该有一个 ['hello', 'world']
的数组。输出的顺序将与参数的输入顺序相同。
输入可以是多个参数、一个数组和其他东西:
Creates an Observable from an Array, an array-like object, a Promise, an iterable object, or an Observable-like object.
这里有一个 Fiddle 来测试它(只需调出控制台)。
你可以使用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>
我有这个代码:
let $obs = Rx.Observable.merge(
this.obsEnqueue,
Rx.Observable.timer(2000)
);
但这不是我想要的 - 我想做的是等到两个事件都触发(来自 this.obsEnqueue
的事件和来自 Rx.Observable.timer()
的事件)。
merge
很可能会创建一个新的 Observable,当第一个事件发生时,所有的 observable 都被传入。我想创建一个新的 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 是什么?
你也许可以使用 forkJoin:
Rx.Observable.forkJoin(
Rx.Observable.of('hello').delay(2000),
Rx.Observable.of('world').delay(1000)
)
.subscribe(console.log)
两秒后你应该有一个 ['hello', 'world']
的数组。输出的顺序将与参数的输入顺序相同。
输入可以是多个参数、一个数组和其他东西:
Creates an Observable from an Array, an array-like object, a Promise, an iterable object, or an Observable-like object.
这里有一个 Fiddle 来测试它(只需调出控制台)。
你可以使用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>