如何在RxJS中通过点击流从一个流遍历数组?

时间:2015-12-08 17:32:39

标签: javascript reactive-programming rxjs

我是rxjs的新手并且坚持一项简单的任务。 假设我有一个带数组的流:

var array$ = Rx.Observable.just([1, 2, 3, 4, 5]);

我还有另一个点击流:

var click$ = Rx.Observable.fromEvent(
  document.getElementById('button'),
  'click'
)

如何组合它们以在每次点击时从数组中获取每个元素(第一次点击1次,第二次点击2次,依此类推)?

3 个答案:

答案 0 :(得分:1)

有很多方法可以做到这一点。一个简单的如下:

var click$ = Rx.Observable.fromEvent(
  document.getElementById('button'),
  'click'
);

var combined$ = otherButtonClick$.flatMapLatest(function (){
 return click$
  .map(function(value, index){return index;})
  .withLatestFrom(array$, function(index, array){return array[index];})
 });

你想通过这个目标实现更大的目标吗?

答案 1 :(得分:0)

just()将返回整个数组。您想使用fromArray()来创建第一个流。然后,您可以将两个数组压缩在一起以获取数组流中的下一个元素:



var array$ = Rx.Observable.fromArray([1, 2, 3, 4, 5]);

var click$ = Rx.Observable.fromEvent(
  document.getElementById('button'),
  'click'
).zip(array$, function(click, num) {return num}).subscribe(function(el){
  return el;
})

<script src="//cdnjs.cloudflare.com/ajax/libs/rxjs/2.5.3/rx.all.js"></script>
<button id="button">
  button
</button>
&#13;
&#13;
&#13;

答案 2 :(得分:0)

你需要使用一些背压机制,如:

  • 示例1:

    var array$ = Rx.Observable.from([1, 2, 3, 4, 5]).controlled;
    
    var click$ = Rx.Observable.fromEvent(
      document.getElementById('button'),
      'click'
    )
    
    array$.subscribe(function(value){ console.log(value); });
    
    click$.subscribe(function(){
      array$.request(1);
    })
    
  • 示例2(使用联合收割机)

    var array$ = Rx.Observable.from([1, 2, 3, 4, 5]).controlled;
    
    var click$ = Rx.Observable.fromEvent(
      document.getElementById('button'),
      'click'
    )
    
    click$.flatMap(function(){
      return Rx.Observable.create(function(observer){
        array$.first().subscribe(observer);
        array.request(1);
      }
    })
    .subscribe(function(value){ console.log(value); });