`map`方法在RxJS中意味着什么?

yaq*_*awa 24 javascript rxjs

我正在通过阅读本教程学习RxJShttp://reactive-extensions.github.io/learnrx/.

我很难理解地图方法Observable.该Array版本map是非常简单明了.我不知道mapa的情况究竟是什么意思Observable(为什么它有一个名为select?!的别名).

这是文档告诉我的内容.可能对大多数初学者没有帮助......

通过合并元素的索引,将可观察序列的每个元素投影到新形式中.这是select方法的别名.

map在上下文中我不明白event.例如,下面的代码完全符合我的预期.我把这段代码想象成:" click-event从事件流中听取#btn".

var btnClicks, observable;

btnClicks = Rx.Observable.fromEvent($('#btn'), "click");

observable = btnClicks.subscribe(function(e) {
	console.log(e);
});
Run Code Online (Sandbox Code Playgroud)

但是当它变成这个时会发生什么?

var btn2Clicks, btnClicks, observable;

btnClicks = Rx.Observable.fromEvent($('#btn'), "click");

btn2Clicks = Rx.Observable.fromEvent($('#btn2'), "click");

observable = btnClicks.map(function(e) {
  return btn2Clicks;
}).subscribe(function(e) {
  console.log(e);
});
Run Code Online (Sandbox Code Playgroud)

我的想法是使用将map点击事件的集合转换为另一个事件集合集合.这filter很容易理解,正如单词的filter意思,只有我感兴趣的事件,并跳过其他人.但是map在上下文中event怎么样?如果它意味着'将一个集合转换为另一个集合'就像数组版本一样,为什么它在#btn点击时仍会触发?

我的意思是我心中已经是映射到另一个集合,现在它不再是点击事件的集合#btn,但它的一些新的集合......但是,当它仍是起火#btn点击其中任何意义我.

Bra*_*don 36

map对Observables的工作方式与对数组的工作方式完全相同.您可以使用map将项目集合转换为不同项目的集合.如果您将Observable视为项的集合(就像数组也是项的集合一样),这会有所帮助,至少从观察者的角度来看.

例如,将您编写的这两个方法用于某些数组:

function multiplyByTwo(collection) {
    return collection.map(function (value) {
        return value * 2;
    });
}

function removeZeroes(collection) {
    return collection.filter(function (value) {
        return value !== 0;
    });
}

var a = [1, 2, 3, 4, 0, 5];
var b = multiplyByTwo(a); // a new array [2, 4, 6, 8, 0, 10]
var c = removeZeroes(b); // a new array [2, 4, 6, 8, 10]
Run Code Online (Sandbox Code Playgroud)

您可以将这些相同的函数用于可观察的:

var a = Rx.Observable.of(1, 2, 3, 4, 0, 5);
var b = multiplyByTwo(a); // a new observable [2, 4, 6, 8, 0, 10]
var c = removeZeroes(b); // a new observable [2, 4, 6, 8, 10]
Run Code Online (Sandbox Code Playgroud)

这是可能的,因为RxJs observable实现了数组运算符,map并且filter具有与数组完全相同的语义.如果您知道它们如何用于数组,那么您就知道它们如何用于可观察数据.

这个技巧是可观察量和可枚举性双重性质的结果.

如果您正在查看正在查看的交互式教程,它实际上将引导您完成此过程.我相信它会通过为数组编写地图运算符来启动你,然后在后来的教程中将一个可观察的信息作为源代码.

PS它select因其历史而成为别名:Reactive Extensions首先在.NET中实现,后来移植到其他语言.Rx.NET使用.NET的LINQ使用的相同运算符(因为IObservable它是双重的IEnumerable).LINQ的地图运算符被称为Select(并且其过滤运算符被称为Where).这些名字来自LINQ的起源.构建LINQ时的目标之一是使用C#编写数据库查询成为可能.因此,他们为许多运算符采用SQL命名约定(LINQ SELECT直接映射到SQL SELECT,LINQ WHERE映射到SQL WHERE等).