如何使单个事件在RxJS中发出多个项目?

时间:2016-01-06 17:48:14

标签: rxjs

我使用RxJS将SVG图形和鼠标/触摸事件绑定在一起。

其中一个挑战是,在iOS上,单个touchstart事件可以携带多个触摸数据。当它只是一个时,我可以简单地使用select并将每个TouchEvent转换为可观察的坐标(即每个触摸开始启动新的拖动)。但是,如何从单个事件中向观察者添加2个或3个条目?

不确定是否flatMap。也许selectMany是?我已经阅读了这些手册,但它们......有点纠结,充满了流动的语言。

有问题的行是 these 。如果您有兴趣在浏览器中制作交互式SVG图形更容易编程,欢迎帮助完成项目!

2 个答案:

答案 0 :(得分:6)

selectManyflatMap相同。 RxJS提供了一些示例,也适用于Drag'n'Drop,您可以找到它here

如果这不符合您的需求,您可以使用Rx.Subject发送通知,例如

var oneSubject = new Rx.Subject();
var otherSubject = new Rx.Subject();
someObservable.subscribe(function(x) {
    oneSubject.onNext('hello');
    otherSubject.onNext(42);
});

// subscribe to oneSubject or otehrSubject

修改 如果你的意思是“一个事件到多个项目”,你得到一个x并希望发送n次x,那么你也可以使用repeat,例如n = 10

someObservable.flatMap(function(x) { return Rx.Observable.repeat(x, 10); });

答案 1 :(得分:1)

似乎 # double space a file $ awk '1;{print ""}' file 使用起来非常简单。

然而对于 # or like this $ awk 'BEGIN{ORS="\n\n"};1' file ,将一个输入值转换为输出(发出)值,对于.selectMany,一个返回一个数组或者可观察的(两个都工作)的0..n值,希望发射。就是这样。 :)

我的代码最终是这样的:

select

.selectMany是一个辅助函数,用于创建0..n-1种子数组:

return range( 0, ev.changedTouches.length ).map( function (i) {
  return touchDragObs( ev, i );
} );

另一个选择是(两个都有效):

range

如果有人知道上述选项的表现指示,我想知道。