[英]What does the `map` method mean in RxJS?
我正在通过阅读本教程http://reactive-extensions.github.io/learnrx/
学习RxJS 。
我很难理解Observable
的map方法。 map
的Array
版本非常简单明了。 我不知道map
在Observable
情况下究竟意味着什么(以及为什么它有一个名为select
的别名?!)。
这是文档告诉我的。 可能对大多数初学者没有帮助...
通过合并元素的索引,将可观察序列的每个元素投影到新形式中。 这是 select 方法的别名。
我不理解event
上下文中的map
。 例如,下面的代码完全符合我的预期。 我认为这段代码是:“从#btn
的事件流中监听click-event
”。
var btnClicks, observable; btnClicks = Rx.Observable.fromEvent($('#btn'), "click"); observable = btnClicks.subscribe(function(e) { console.log(e); });
但是当它变成这个时会发生什么??
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); });
我的想法是使用map
将一个点击事件集合转换为另一个事件集合集合。 filter
很容易理解,就像filter
这个词的意思,只取我感兴趣的事件,其他跳过。 但是在event
上下文中的map
怎么样? 如果它意味着“将一个集合转换为另一个集合”就像数组版本一样,为什么在单击#btn
时它仍然会触发??
我的意思是我已经将它映射到另一个集合,现在它不再是#btn
的点击事件的#btn
而是一个新的集合......但是当#btn
点击时它仍然会触发,这对我来说没有意义。
map
对 Observables 的作用与对数组的作用完全相同。 您可以使用map
将项目集合转换为不同项目的集合。 如果您将 Observable 视为项目的集合(就像数组也是项目的集合),至少从观察者的角度来看,这会有所帮助。
例如,将您编写的这 2 个方法用于某些数组:
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]
您可以对 observable 使用这些相同的函数:
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]
这是可能的,因为 RxJs observables 实现了像map
和filter
这样的数组运算符,以具有与数组完全相同的语义。 如果您知道它们如何用于数组,那么您就知道它们如何用于 observable。
这个技巧是observables 和 enumerables 双重性质的结果。
如果您完成正在查看的交互式教程,它实际上会引导您完成此过程。 我相信它通过为数组编写映射运算符开始,然后在以后的教程中将 observable 作为源。
PS 由于它的历史,它是select
的别名:Reactive Extensions 首先在 .NET 中实现,后来移植到其他语言。 Rx.NET 使用与 .NET 的 LINQ 相同的运算符(因为IObservable
是IEnumerable
对偶)。 LINQ 的 map 运算符称为Select
(其过滤器运算符称为Where
)。 这些名称来自 LINQ 的起源。 构建 LINQ 时的目标之一是使用 C# 编写数据库查询成为可能。 因此,他们为许多运算符采用了 SQL 命名约定(LINQ SELECT 直接映射到 SQL SELECT,LINQ WHERE 映射到 SQL WHERE 等)。
Rxjs 中的 Map 用于投影,这意味着您可以将数组转换为全新的数组。 为了理解 Map 是如何工作的,我们可以使用普通的 javascript 实现我们自己的 map 函数。
Array.prototype.map = function(projectionFunction){
var results=[];
this.forEach(function(item) {
results.push(projectionFunction(item));
});
return results;
};
你可以看到我写了一个 map 函数,它接受一个匿名函数作为参数。 这将是您应用投影来转换数组的函数。 在 map 函数内部,您可以看到迭代数组中的每个项目,通过传递每个项目调用 project 函数,最后将投影函数的结果推送到 results 数组。
JSON.stringify([1,2,3].map(function(x){return x+1;}))
输出
[2,3,4]
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.