Rxjs【map钞速、mapTo、filter】

Rxjs學(xué)習(xí)之路

1嫡秕、小貼士

這篇文章是我的Angular Rxjs Series中的第二篇文章渴语,在繼續(xù)閱讀本文之前,您至少應(yīng)該熟悉系列中的第一篇基礎(chǔ)文章:

Rxjs6都改變了些什么昆咽?

Rxjs【Observable】

// 圖譜
// ----- 代表一個(gè)Observable
// -----X 代表一個(gè)Observable有錯(cuò)誤發(fā)生
// -----| 代表一個(gè)Observable結(jié)束
// (1234)| 代表一個(gè)同步Observable結(jié)束

// 特別提示:以下的操作符介紹均采用rxjs6的寫(xiě)法<菪住!掷酗!

2调违、map

1、其實(shí)map操作符和js數(shù)組里的map差不多泻轰,都是傳入一個(gè)callback技肩,執(zhí)行callback回傳新值.
2、具體例子如下代碼:
/**
 * 例如: interval(1000).pipe(map(x => x + 1));
 *       -----0-----1-----2-----3--...
 *              map(x => x + 1)
 *       -----1-----2-----3-----4--...
 */
interval(1000).pipe(
    map(x => x + 1)
).subscribe({
    next: (value) => { console.log('======map操作符: ', value); },
    error: (error) => { console.log('======map操作符---Error: ', error); },
    complete: () => { console.log('======map操作符: complete'); }
});

3浮声、mapTo

1虚婿、mapTo是把傳進(jìn)來(lái)的值改寫(xiě)成為一個(gè)固定值
2殖告、具體例子如下代碼:
/**
 * 例如: interval(1000).pipe(mapTo(2))
 *      -----0-----1-----2-----3--...
 *              mapTo(2)
 *      -----2-----2-----2-----2--...
 */
interval(1000).pipe(
    mapTo('mapTo')
).subscribe({
    next: (value) => { console.log('======mapTo操作符: ', value); },
    error: (error) => { console.log('======mapTo操作符---Error: ', error); },
    complete: () => { console.log('======mapTo操作符: complete'); }
});

4、filter

1雳锋、其實(shí)filter操作符和js數(shù)組里的filter也差不多黄绩,都是傳入一個(gè)call back,執(zhí)行callback玷过,根據(jù)回傳的boolean值過(guò)濾源數(shù)據(jù)爽丹,再回傳新值。
2辛蚊、具體例子如下代碼:
/**
 * 例如:interval(1000).pipe(filter(x => x % 2 === 0));
 *      -----0-----1-----2-----3-----4--...
 *           filter(x => x % 2 === 0)
 *      -----0-----------2-----------4--...
 */
interval(1000).pipe(
    filter(x => x % 2 === 0)
).subscribe({
    next: (value) => { console.log('======filter操作符: ', value); },
    error: (error) => { console.log('======filter操作符---Error: ', error); },
    complete: () => { console.log('======filter操作符: complete'); }
});

完整的例子

import { Component, OnInit, OnDestroy } from '@angular/core';
import { Observable, of, interval, Subscription } from 'rxjs';
import { map, take, mapTo, filter } from 'rxjs/operators';

@Component({
    selector: 'app-rxjs-demo',
    template: `
        <h3>Rxjs Demo To Study! -- Operators操作符(map粤蝎、mapTo、filter)</h3>
        <button (click)="originMapHandler()">origin map</button>
        <button class="mgLeft" (click)="mapHandler()">map</button>
        <button class="mgLeft" (click)="mapToHandler()">mapTo</button>
        <button class="mgLeft" (click)="filterHandler()">mapTo</button>
        <app-back></app-back>
    `,
    styles: [`
        .mgLeft {
            margin-left: 20px;
        }
    `]
})
export class RxjsDemoComponent implements OnInit, OnDestroy {
    originMapSubscription: Subscription;
    mapSubscription: Subscription;
    mapToSubscription: Subscription;
    filterSubscription: Subscription;

    constructor() { }

    ngOnInit(): void {
        // 圖譜
        // ----- 代表一個(gè)Observable
        // -----X 代表一個(gè)Observable有錯(cuò)誤發(fā)生
        // -----| 代表一個(gè)Observable結(jié)束
        // (1234)| 代表一個(gè)同步Observable結(jié)束
    }

    map(source, callback) {
        return Observable.create(observer => {
            return source.subscribe(
                (value) => {
                    try {
                        observer.next(callback(value));
                    } catch (e) {
                        observer.error(e);
                    }
                },
                (err) => { observer.error(err); },
                () => { observer.complete(); }
            );
        });
    }

    originMapHandler() {
        // 1. 傳統(tǒng)寫(xiě)法創(chuàng)建Map操作符
        const people = of('Jerry', 'Anna');
        const helloPlople = this.map(people, item => item + ' Hello~');
        this.originMapSubscription = helloPlople.subscribe({
            next: (value) => { console.log('======傳統(tǒng)寫(xiě)法創(chuàng)建Map操作符: ', value); },
            error: (error) => { console.log('======傳統(tǒng)寫(xiě)法創(chuàng)建Map操作符---Error: ', error); },
            complete: () => { console.log('======傳統(tǒng)寫(xiě)法創(chuàng)建Map操作符: complete'); }
        });
    }

    mapHandler() {
        /**
         * 例如: interval(1000).pipe(map(x => x + 1));
         *       -----0-----1-----2-----3--...
         *              map(x => x + 1)
         *       -----1-----2-----3-----4--...
         */
        this.mapSubscription = interval(1000).pipe(
            map(x => x + 1),
            take(4)
        ).subscribe({
            next: (value) => { console.log('======map操作符: ', value); },
            error: (error) => { console.log('======map操作符---Error: ', error); },
            complete: () => { console.log('======map操作符: complete'); }
        });
    }

    mapToHandler() {
        /**
         * 例如: interval(1000).pipe(mapTo(2))
         *      -----0-----1-----2-----3--...
         *              mapTo(2)
         *      -----2-----2-----2-----2--...
         */
        this.mapToSubscription = interval(1000).pipe(
            mapTo('mapTo'),
            take(3)
        ).subscribe({
            next: (value) => { console.log('======mapTo操作符: ', value); },
            error: (error) => { console.log('======mapTo操作符---Error: ', error); },
            complete: () => { console.log('======mapTo操作符: complete'); }
        });
    }

    filterHandler() {
        /**
         * 例如:interval(1000).pipe(filter(x => x % 2 === 0));
         *      -----0-----1-----2-----3-----4--...
         *           filter(x => x % 2 === 0)
         *      -----0-----------2-----------4--...
         */
        this.filterSubscription = interval(1000).pipe(
            filter(x => x % 2 === 0),
            take(5)
        ).subscribe({
            next: (value) => { console.log('======filter操作符: ', value); },
            error: (error) => { console.log('======filter操作符---Error: ', error); },
            complete: () => { console.log('======filter操作符: complete'); }
        });
    }

    ngOnDestroy() {
        if (this.originMapSubscription) {
            this.originMapSubscription.unsubscribe();
        }
        if (this.mapSubscription) {
            this.mapSubscription.unsubscribe();
        }
        if (this.mapToSubscription) {
            this.mapToSubscription.unsubscribe();
        }
        if (this.filterSubscription) {
            this.filterSubscription.unsubscribe();
        }
    }
}

Marble Diagrams【寶珠圖】

1. 這個(gè)Marble Diagrams【寶珠圖】可以很靈活的表現(xiàn)出每個(gè)操作符的使用
2. 下面是超鏈接傳送門(mén)

Marble Diagrams【寶珠圖】

Angular Rxjs Series

  1. Rxjs6都改變了些什么袋马?
  2. Rxjs【Observable】
  3. Rxjs【take, first, takeUntil, concatAll】
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末初澎,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子虑凛,更是在濱河造成了極大的恐慌碑宴,老刑警劉巖,帶你破解...
    沈念sama閱讀 212,884評(píng)論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件桑谍,死亡現(xiàn)場(chǎng)離奇詭異延柠,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)锣披,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,755評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門(mén)贞间,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人雹仿,你說(shuō)我怎么就攤上這事增热。” “怎么了胧辽?”我有些...
    開(kāi)封第一講書(shū)人閱讀 158,369評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵峻仇,是天一觀(guān)的道長(zhǎng)。 經(jīng)常有香客問(wèn)我票顾,道長(zhǎng)础浮,這世上最難降的妖魔是什么帆调? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 56,799評(píng)論 1 285
  • 正文 為了忘掉前任奠骄,我火速辦了婚禮,結(jié)果婚禮上番刊,老公的妹妹穿的比我還像新娘含鳞。我一直安慰自己,他們只是感情好芹务,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,910評(píng)論 6 386
  • 文/花漫 我一把揭開(kāi)白布蝉绷。 她就那樣靜靜地躺著鸭廷,像睡著了一般。 火紅的嫁衣襯著肌膚如雪熔吗。 梳的紋絲不亂的頭發(fā)上辆床,一...
    開(kāi)封第一講書(shū)人閱讀 50,096評(píng)論 1 291
  • 那天,我揣著相機(jī)與錄音桅狠,去河邊找鬼讼载。 笑死,一個(gè)胖子當(dāng)著我的面吹牛中跌,可吹牛的內(nèi)容都是我干的咨堤。 我是一名探鬼主播,決...
    沈念sama閱讀 39,159評(píng)論 3 411
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼漩符,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼一喘!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起嗜暴,我...
    開(kāi)封第一講書(shū)人閱讀 37,917評(píng)論 0 268
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤凸克,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后闷沥,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體触徐,經(jīng)...
    沈念sama閱讀 44,360評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,673評(píng)論 2 327
  • 正文 我和宋清朗相戀三年狐赡,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了撞鹉。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,814評(píng)論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡颖侄,死狀恐怖鸟雏,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情览祖,我是刑警寧澤孝鹊,帶...
    沈念sama閱讀 34,509評(píng)論 4 334
  • 正文 年R本政府宣布,位于F島的核電站展蒂,受9級(jí)特大地震影響又活,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜锰悼,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,156評(píng)論 3 317
  • 文/蒙蒙 一柳骄、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧箕般,春花似錦耐薯、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,882評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)体谒。三九已至,卻和暖如春臼婆,著一層夾襖步出監(jiān)牢的瞬間抒痒,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,123評(píng)論 1 267
  • 我被黑心中介騙來(lái)泰國(guó)打工颁褂, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留评汰,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 46,641評(píng)論 2 362
  • 正文 我出身青樓痢虹,卻偏偏與公主長(zhǎng)得像被去,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子奖唯,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,728評(píng)論 2 351

推薦閱讀更多精彩內(nèi)容