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

如何使一个事件在RxJS中发出多个项?,rxjs,Rxjs,我正在使用RxJS将SVG图形和鼠标/触摸事件绑定在一起 其中一个挑战是,在iOS上,单个touchstart事件可以携带多个触摸数据。当它只有一个时,我可以简单地使用select并将每个TouchEvent转换为一个可观察的坐标(即,每次触摸启动都会启动一个新的拖动)。但是我怎样才能从单个事件中向可观察对象添加2或3个条目呢 不确定是否是flatMap。也许selectMany是什么?我读过这些手册,但它们是。。。有点纠结,充满流畅的语言 有问题的台词是。如果您对使浏览器中的交互式SVG图形更

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

其中一个挑战是,在iOS上,单个
touchstart
事件可以携带多个触摸数据。当它只有一个时,我可以简单地使用
select
并将每个
TouchEvent
转换为一个可观察的坐标(即,每次触摸启动都会启动一个新的拖动)。但是我怎样才能从单个事件中向可观察对象添加2或3个条目呢

不确定是否是
flatMap
。也许
selectMany
是什么?我读过这些手册,但它们是。。。有点纠结,充满流畅的语言


有问题的台词是。如果您对使浏览器中的交互式SVG图形更易于编程感兴趣,欢迎使用该项目提供帮助

selectMany
flatMap
相同。 RxJS提供了一些示例,同样对于Drag'n'Drop,您可以找到它

如果这不符合您的需要,您可以使用发送通知,例如

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,那么您也可以使用,例如
n=10

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

看来,
.selectMany
的使用非常简单

而对于
select
则会将输入值转换为输出(发出)值,对于
.selectMany
则会返回希望发出的0..n值的数组或可观察值(两个功)。就这样。:)

我的代码是这样的:

return range( 0, ev.changedTouches.length ).map( function (i) {
  return touchDragObs( ev, i );
} );
范围是创建0..n-1种子数组的辅助函数:

// JavaScript does not have an Array for range constructor.
//
function range( start, count ) {    // (Int,Int) -> Array of Int
  var arr = [];
  for (var i=0; i<count; i++ ) {
    arr[i]= start+i;
  }
  return arr;
}

如果有人知道上述选项的性能指标,我很想知道。

谢谢,@Chasmo这些示例确实很有帮助-RxJS文档本身更像是一个法律文本。:)我可能会在下面给出我自己的答案,以说明什么是有效的。您的输入仍然很感谢。您的链接已断开(“这些”),谢谢通知。不幸的是,GitHub链接只是暂时的。我在下面的回答中提到了有效的方法-希望能有所帮助。这是一个很好的问题
return Rx.Observable
        
  .range(0,ev.changedTouches.length)   // (start, count)
  .select( function (i) {
    return touchDragObs( ev, i );
        
});