微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

javascript – RxJS中的“map”方法是什么意思?

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

我很难理解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点击这对我没有意义的时候仍然会触发.

解决方法

地图与Observables的功能完全一样,就像数组一样.您可以使用地图将项目集合转换为不同项目的集合.如果您将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,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命名约定.

原文地址:https://www.jb51.cc/js/153828.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐