如何通过 RxJS 中的点击流从一个流中遍历数组?
How to traverse array from one stream by clickstream in RxJS?
我是 rxjs 的新手,遇到了一个简单的任务。
假设我有一个带有数组的流:
var array$ = Rx.Observable.just([1, 2, 3, 4, 5]);
我还有另一个点击流:
var click$ = Rx.Observable.fromEvent(
document.getElementById('button'),
'click'
)
如何组合它们以在每次点击时从数组中获取每个元素(第一次点击 1 个,第二次点击 2 个,依此类推)?
just() 将 return 整个数组。您想要使用 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>
有很多方法可以做到这一点。简单的如下:
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:
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); });
我是 rxjs 的新手,遇到了一个简单的任务。 假设我有一个带有数组的流:
var array$ = Rx.Observable.just([1, 2, 3, 4, 5]);
我还有另一个点击流:
var click$ = Rx.Observable.fromEvent(
document.getElementById('button'),
'click'
)
如何组合它们以在每次点击时从数组中获取每个元素(第一次点击 1 个,第二次点击 2 个,依此类推)?
just() 将 return 整个数组。您想要使用 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>
有很多方法可以做到这一点。简单的如下:
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:
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); });