javascript - RxJS 中的 `map` 方法是什么意思?

标签 javascript rxjs

我正在学习RxJS阅读本教程http://reactive-extensions.github.io/learnrx/

我很难理解 map Observable 的方法。 mapArray 版本非常简单明了。我不知道 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.

我不明白事件上下文中的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 单击,这对我来说没有意义。

最佳答案

map 对于 Observables 的作用与对于数组的作用完全相同。您可以使用 map 将项目集合转换为不同项目的集合。如果您将 Observable 视为项目的集合(就像数组也是项目的集合),至少从观察者的 Angular 来看,这会很有帮助。

例如,采用您编写的用于某些数组的这 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]

您可以对可观察对象使用这些相同的函数:

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 实现了像 mapfilter 这样的数组运算符,使其具有与数组完全相同的语义。如果您知道它们如何用于数组,那么您就知道它们如何用于可观察量。

这个技巧是 dual nature of observables and enumerables 的结果.

如果您完成正在查看的交互式教程,它实际上会引导您完成此过程。我相信它是从为数组编写映射运算符开始的,然后在后面的教程中将可观察值作为源。

附注 它是 select 的别名,因为它的历史:响应式扩展首先在 .NET 中实现,后来移植到其他语言。 Rx.NET 使用与 .NET 的 LINQ 相同的运算符(因为 IObservable 是 IEnumerable 的对偶)。 LINQ 的映射运算符称为Select(其过滤运算符称为Where)。这些名称源自 LINQ 的起源。构建 LINQ 的目标之一是使用 C# 编写数据库查询成为可能。因此,他们对许多运算符采用了 SQL 命名约定(LINQ SELECT 直接映射到 SQL SELECT,LINQ WHERE 映射到 SQL WHERE,等等)。

关于javascript - RxJS 中的 `map` 方法是什么意思?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28107986/

相关文章:

typescript - Angular2 合并可观察对象

angular - 使用 Observables 在 Angular 中一个接一个地调用两个服务

javascript - 如何从单个选择中获取包含对象的选定选项 - Angular

angular - 试图在 Angular 2 项目中将多个 observables 合并为一个

Angular 9 通用 - 运行错误 : can not read property 'type' of undefined - TokenStream

javascript - Jquery/Javascript 数学 : Why are these two 1 line math problems not giving the same answer?

javascript - Jquery child>Parent>child>child 选择器

javascript - SharePoint 2013计算列(文本+日期)

javascript - 我该如何解决这个错误? "export ' default'(导入为 'App' )在 './App' 中找不到(可能导出 : App)"(im using react)

javascript - 条形图的厚度