我很难理解Observable的map方法. Array版本的map真的很简单直接.我不知道在一个Observable的情况下,地图是什么意思(为什么它有一个名为select ?!的别名).
这是文档告诉我的.可能对大多数初学者没有帮助
Projects each element of an observable sequence into a new form by incorporating the element’s index. This is an alias for the select method.
在事件的上下文中我不明白地图.
例如,下面的代码正好符合我的预期.我想到这段代码是:“从#btn的事件流中收听点击事件”.
var btnClicks,observable; btnClicks = Rx.Observable.fromEvent($('#btn'),"click"); observable = btnClicks.subscribe(function(e) { console.log(e); });
但是当它变成这样的时候会怎么样?
var btn2Clicks,btnClicks,"click"); btn2Clicks = Rx.Observable.fromEvent($('#btn2'),"click"); observable = btnClicks.map(function(e) { return btn2Clicks; }).subscribe(function(e) { console.log(e); });
我以为是使用地图将click事件的集合转换为另一个事件集合集合.
过滤器很容易理解,它就像过滤器一样,只采取我感兴趣的事件,并跳过其他.但是在事件的背景下地图呢?如果它意味着“将集合转换为另一个集合”就像数组版本一样,为什么当#btn点击时仍然会触发?
我的意思是我将它映射到另一个集合,现在它不再是#btn的点击事件的集合,但它是一个新的集合的东西…但是当#btn点击这对我没有意义的时候仍然会触发.
解决方法
例如,将这两个方法写入使用某些数组:
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,5]; var b = multiplyByTwo(a); // a new array [2,6,8,10] var c = removeZeroes(b); // a new array [2,10]
你可以使用这些相同的功能来观察:
var a = Rx.Observable.of(1,5); var b = multiplyByTwo(a); // a new observable [2,10] var c = removeZeroes(b); // a new observable [2,10]
这是可能的,因为RxJs observables实现像map和filter这样的数组运算符具有与数组完全相同的语义.如果你知道它们是如何为数组工作的,那么你知道它们是如何用于可观察的.
这个技巧是dual nature of observables and enumerables的结果.
如果您正在浏览您正在浏览的互动教程,那么它实际上将引导您完成此过程.我相信它会通过编写数组的地图运算符来启动你,然后在后面的教程中将一个可观察的内容作为源代码.
附:它是一个别名,因为它的历史选择:反动扩展首先在.NET中实现,然后移植到其他语言. Rx.NET使用.NET的LINQ使用的相同的运算符(因为IObservable是IEnumerable的两倍). LINQ的地图运算符称为Select(其筛选器运算符称为Where).这些名字来自LINQ的起源. LINQ构建的目标之一是使C#中编写数据库查询成为可能.因此,它们为许多运算符(LINQ SELECT直接映射到sql SELECT,LINQ WHERE映射到sql WHERE等)采用sql命名约定.