zip

作者: JamesSawyer | 来源:发表于2017-12-10 14:15 被阅读6次

将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|

相关文章

网友评论

      本文标题:zip

      本文链接:https://www.haomeiwen.com/subject/ctfvixtx.html