将2个流合并成1个流,在时间上先产出的值会等待另一个流产生的值,然后再一起output
---------------nth of foo
----nth of bar
zip
---------------(nth of foo + nth of bar) => output of foo and bar
另外 zip
有静态方法,所以下面的写法是等同的
Rx.Observable.zip(foo, bar, (f, b) => {...})
等价于
foo.zip(bar, (f, b) => { ... })
示例
var foo = Rx.Observable.interval(500).take(5);
var bar = Rx.Observable.interval(400).take(7);
/*
----0----1----2----3----4| (foo)
---0---1---2---3---4---5---6| (bar)
zip((x, y) => x + y)
----0----2----4----6----8|
*/
var result = foo.zip(bar, (x, y) => x + y);
result.subscribe(console.log)
// 打印
0
2
4
6
8
解释:
- bar先产生第一个值0,但是此时foo还没有值, 等foo产出第一个值0时,进行操作 返回0+0 = 0
- bar先产生第2个值1,但是此时foo还没有值, 等foo产出第2个值1时,进行操作 返回 1 + 1 = 2
- 以此类推
- bar先产生第4个值3,但是此时foo还没有值, 等foo产出第4个值3时,进行操作 返回 3 + 3 = 6
一般使用 zip
操作符的情形比较少,另外我们根据zip 等待
的特性,将一个立即完成的流(也称之为 sequence stream
)转换为按时间产生的流
var foo = Rx.Observable.of(1, 2, 3, 4, 5);
var bar = Rx.Observable.interval(1000);
/*
(12345|) (foo) sequence stream
---0---1---2---3---4---5---...
zip((f, _) => f) // 此处使用 (f, _) => f 函数 表示我们不关心bar产生的值
---1---2---3---4---5|
网友评论