【Angular】Angular的操作符总结

运营商是指

    • オペレーターは、 リアクティブプログラミング で、Observableクラスで扱う ストリームの高度な操作 を可能にするための関数です。

リアクティブプログラミング:流れてくるデータ(ストリーム)に関連性と操作を宣言的に記述する手法のことです
Observable:ストリームを扱うクラスです

例:マウス操作やHTTPリクエストでデータ取得するなど

ストリームは川の様なイメージです
つまりオペレータは、川(ストリーム)の 中間で処理する仕組み であり、流れてきたデータを下流でキャッチして、オブジェクト間のデータのやり取りをします

主要运营商的使用方法

OF操作

    渡ってきたデータに何もせずそのまま流します
import { of } from 'rxjs';
const cats = of('cat1', 'cat2','cat3');
cats.subscribe(cat => console.log(cat)); // cat1, cat2, cat3

地图操作员

    渡ってきたデータを受け取って違うデータを返します
import { of } from 'rxjs';
import { map } from 'rxjs/operators';

const nums = of(1, 2, 3)
.pipe(
  map(num => num * num)
).subscribe(
  num  => console.log(num) // 1, 4, 9
);

筛选运算符

    • 流れてきたデータチェックを行い、条件にあった場合のみ、ストリームが流れます

文字列一致判定、typeOf演算子で、どの種類の演算子か判定するなどに使えます

import { of } from 'rxjs';
import { filter } from 'rxjs/operators';

const cats = of('mike', 'tama', 'mikeneko')
.pipe(
  filter(cat => cat === 'mike')
).subscribe(
  cat => console.log( `matched: ${cat}`) //matched: mike
);

防抖时间操作符

    • 連続してデータを流すときに、指定時間遅延後、最後のデータを一度のみストリームを流します

debounceTime(250)では、250msec以下のストリームは流れない

何回も流れないように制御できます

import { of } from 'rxjs';
import { map, debounceTime } from 'rxjs/operators';

// 連続する最後の処理から250ミリ秒遅延後、最後のデータを1度だけストリームに流す
const nums = of(1, 2, 3, 4, 5, 6, 7, 8, 9, 10)
.pipe(
    debounceTime(250),
    map(value => `debounceTime(250): ${value}`)
)
.subscribe(
  value  => console.log(value) // debounceTime(250): 10
);

节流时间操作符

    • 連続してデータを流すときに、中間処理を250ミリ秒間隔で間引くことができます

windowのスクロールを間引きたいときなどに使います

import { of } from 'rxjs';
import { map, throttleTime } from 'rxjs/operators';

// 連続する処理を250ミリ秒間隔で間引く
const nums = of(1, 2, 3, 4, 5, 6, 7, 8, 9, 10)
.pipe(
    throttleTime(250),
    map(value => `throttleTime(250): ${value}`)
)
.subscribe(
  value  => console.log(value) // debounceTime(250): 1
);

distinctUntilChanged 运算符

    • 前回とデータが違う時のみデータを流します

同じデータを連続で流したくない時に使います

import { of } from 'rxjs';
import { distinctUntilChanged, map } from 'rxjs/operators';

// 前回と値が違う場合のみ、ストリームを流す
const cats = of('mike', 'mike', 'mike' ,'mikeneko')
.pipe(
    distinctUntilChanged(),
).subscribe(
    cat => console.log( `distinctUntilChanged: ${cat}` ) 
);

// distinctUntilChanged: mike
// distinctUntilChanged: mikeneko

switchMap操作符

    • Stream Aに流れてくるデータを元に、別のStream Bを流します

Observable を切り替えて、別のObservable を返すことができます
別のStream Bが終わる前に、元のStream A が流れた場合、途中までのStream Bはキャンセルされて、始めから再び実行されます

HTTPクライアントでリクエストを投げた後、処理を途中で止める時に使います

import { interval, of } from 'rxjs';
import { map, switchMap, take} from 'rxjs/operators';

const cats = of('mike', 'mike', 'mike' ,'mikeneko') // StreamA
.pipe(
    switchMap(cat => {
          return interval(1000).pipe( // StreamB
            take(3),
            map((index) => `switchMap: ${index} => ${cat}`)
          );
      })
  )       
.subscribe(
    cat => console.log( `${cat}` ) 
);

跳过操作符 guò zuò fú)

    指定した回数分、意図的にデータを流さない時に使います
import { of } from 'rxjs';
import { skip } from 'rxjs/operators';

const cats = of('mike', 'mike', 'mike' ,'mikeneko') 
.pipe(
    skip(2),
)       
.subscribe(
    cat => console.log( `skip: ${cat}` ) 
);

//skip: mike
//skip: mikeneko

获取操作符

    • 指定回数のみ実行するときに使います

初めの一回のみ実行したいなど

import { of } from 'rxjs';
import { take } from 'rxjs/operators';

let count = 0;
const cats = of('mike', 'tama', 'mike' ,'mikeneko', 'tama') 
.pipe(
    take(3)
)       
.subscribe(
    cat => console.log( `take(${++count}): ${cat}` ) 
);

//take(1): mike
//take(2): tama
//take(3): mike

完成操作符

    • 引数で渡したコールバック関数を、ストリームが流れた最後に実行します

 

    • ストリームが流れた最後に処理を行う時に使います

HTTPリクエストで画面にローディングアイコンを表示した際に、処理の再後にアイコンを非表示にするなど

import { interval } from 'rxjs';
import { map, take, finalize } from 'rxjs/operators';

interval(1000) // 1sずつカウントアップ
.pipe(
    map(index => `finalize(map): ${index + 1}`),
    take(3),
    finalize(() => {
      setTimeout(() => console.log( 'finalize!(ˆoˆ)' ) , 100);
    }),
)       
.subscribe(
    val => console.log( `${val}` ) 
);

// finalize(map): 1
// finalize(map): 2
// finalize(map): 3
// finalize!(ˆoˆ)

(參考網站)

    • 様々なオペレータの動作を視覚的に確認できます?

 

    RxJS marbles
广告
将在 10 秒后关闭
bannerAds