博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
[RxJS] Combining streams in RxJS
阅读量:5082 次
发布时间:2019-06-13

本文共 3722 字,大约阅读时间需要 12 分钟。

Source:

 

We will looking some opreators for combining stream in RxJS:

  • merge
  • combineLatest
  • withLatestFrom
  • concat
  • forkJoin
  • flatMap / switchMap

 

 Merge: 

Observable.merge behaves like a "logical OR" to have your stream handle one interaction OR another.

let btn1 = document.querySelector("#btn1");let btn2 = document.querySelector("#btn2");let btn1Click$ = Rx.Observable.fromEvent(btn1, "click");let btn2Click$ = Rx.Observable.fromEvent(btn2, "click");let btn1Log$ = btn1Click$.map( (ev) => {  console.log("Button 1 clicked");});let btn2Log$ = btn2Click$.map( (ev) => {  console.log("Button 2 clicked");});let clicks$ = Rx.Observable.merge(btn1Log$, btn2Log$);clicks$.subscribe();

 

combineLatest:

Ofter used when one of streams value changed, then produce a side effect:

var source1 = Rx.Observable.interval(1000)  .map(function (i) { return 'First: ' + i; });var source2 = Rx.Observable.interval(2000)  .map(function (i) { return 'Second: ' + i; });// Combine latest of source1 and source2 whenever either gives a valuevar source = Rx.Observable.combineLatest(    source1,    source2  ).take(4);var subscription = source.subscribe(  function (x) {    console.log(x);  },  function (err) {    console.log('Error: %s', err);  },  function () {    console.log('Completed');  });/*["First: 0", "Second: 0"]["First: 1", "Second: 0"]["First: 2", "Second: 0"]["First: 2", "Second: 1"]"Completed"*/

 

withLatestFrom: 

var source1 = Rx.Observable.interval(1000)  .map(function (i) { return i; });var btn = document.querySelector("#btn");var source2 = Rx.Observable.fromEvent(btn, "click");var source =source1.withLatestFrom(  source2,  (source1, click) => ({timer: source1, clicks: click.x})).take(4);var subscription = source.subscribe(  function (x) {    console.log(x);  },  function (err) {    console.log('Error: %s', err);  },  function () {    console.log('Completed');  });

 

Read the difference between combineLatest and withLatestFrom: .

 

concat:

Concat will combine two observables into a combined sequence, but the second observable will not start emitting until the first one has completed.

let first = Rx.Observable.interval(1000).take(3).do( (i) => { console.log("First: ", i);});let second = Rx.Observable.interval(500).take(3).do( (i) => { console.log("Second: ", i);});first.concat(second).subscribe();/*"First: "0"First: "1"First: "2"Second: "0"Second: "1"Second: "2*/

 

forkJoin:

We use forkJoin to execute observables in parallel. One common use case of this is making multiple http requests in parallel. In my sample I am forkJoining two very simple observables, but the key point is that the subscriber won't receive any values until both observables have completed.

let first = Rx.Observable.interval(1000).take(6);let second = Rx.Observable.interval(500).take(3);Rx.Observable.forkJoin(first, second).subscribe(  (res) =>{    console.log(res); // [5, 2]  },  (err) => {    console.log(err);  },  () => {    console.log("Completed");  // Completed  });

 

flatMap / switchMap

flatMap and switchMap basic are the same.

Just switchMap only care about the latest value, will ignore the previous value. So good to use with http reuqest.

The reason to use flatMap is because inside Observable you migth return another Observable, such as:

var btn = document.querySelector("#btn");var click$ = Rx.Observable.fromEvent(btn, "click");var promise$ = Rx.Observable.fromPromise( jquery.http('xxx'));var xhrCall$ = click$.flatMap( () => {    return promise$;});xhrCall$.subscribe( (res) => {  console.log(res);    })

Inside Observalbe return another Observable, will create a 2-d Observable, just like inside map ruturn another array, will create 2-d array.

So we need to flatten it.

 

转载于:https://www.cnblogs.com/Answer1215/p/5410864.html

你可能感兴趣的文章
Window 的引导过程
查看>>
App右上角数字
查看>>
从.NET中委托写法的演变谈开去(上):委托与匿名方法
查看>>
小算法
查看>>
201521123024 《java程序设计》 第12周学习总结
查看>>
新作《ASP.NET MVC 5框架揭秘》正式出版
查看>>
IdentityServer4-用EF配置Client(一)
查看>>
WPF中实现多选ComboBox控件
查看>>
读构建之法第四章第十七章有感
查看>>
Windows Phone开发(4):框架和页 转:http://blog.csdn.net/tcjiaan/article/details/7263146
查看>>
Unity3D研究院之打开Activity与调用JAVA代码传递参数(十八)【转】
查看>>
python asyncio 异步实现mongodb数据转xls文件
查看>>
TestNG入门
查看>>
【ul开发攻略】HTML5/CSS3菜单代码 阴影+发光+圆角
查看>>
IOS-图片操作集合
查看>>
IO—》Properties类&序列化流与反序列化流
查看>>
测试计划
查看>>
Mysql与Oracle 的对比
查看>>
jquery实现限制textarea输入字数
查看>>
Codeforces 719B Anatoly and Cockroaches
查看>>