RxJS - Szybki przewodnik
Ten rozdział zawiera informacje o cechach, zaletach i wadach RxJS. Tutaj dowiemy się również, kiedy używać RxJS.
Pełna forma RxJS to Reactive Extension for Javascript. Jest to biblioteka javascript, która używa obserwabli do pracy z programowaniem reaktywnym, które obsługuje asynchroniczne wywołania danych, wywołania zwrotne i programy oparte na zdarzeniach. RxJS może być używany z innymi bibliotekami i frameworkami JavaScript. Jest obsługiwany przez javascript, a także przez maszynopis.
Co to jest RxJS?
Zgodnie z oficjalną witryną RxJS jest zdefiniowana jako biblioteka do tworzenia programów asynchronicznych i opartych na zdarzeniach przy użyciu obserwowalnych sekwencji. Zapewnia jeden typ podstawowy, Observable, typy satelitarne (Observer, Schedulers, Subjects) i operatory inspirowane dodatkami Array # (mapa, filtr, redukcja, every, itp.), Aby umożliwić obsługę zdarzeń asynchronicznych jako kolekcji.
Cechy RxJS
W RxJS następujące koncepcje zajmują się obsługą zadania asynchronicznego -
Zauważalny
Obserwowalna to funkcja, która tworzy obserwatora i dołącza go do źródła, w którym oczekiwane są wartości, na przykład kliknięcia, zdarzenia myszy z elementu dom lub żądanie HTTP itp.
Obserwator
Jest to obiekt z metodami next (), error () i complete (), który zostanie wywołany, gdy nastąpi interakcja z obiektem obserwowalnym, tj. Źródło współdziała z przykładowym kliknięciem przycisku, żądaniem HTTP itp.
Subskrypcja
Kiedy to, co obserwowalne jest tworzone, aby wykonać to, co obserwowalne, musimy je zapisać. Można go również użyć do anulowania wykonania.
Operatorzy
Operator jest czystą funkcją, która przyjmuje obserwowalne jako dane wejściowe, a wyjście jest również obserwowalne.
Przedmiot
Temat jest obserwowalny, który może być rozsyłany grupowo, czyli rozmawiać z wieloma obserwatorami. Rozważmy przycisk z detektorem zdarzenia, funkcja dołączona do zdarzenia za pomocą addlistener jest wywoływana za każdym razem, gdy użytkownik kliknie przycisk. Podobna funkcjonalność dotyczy również tematu.
Harmonogramy
Harmonogram kontroluje wykonanie subskrypcji, kiedy ma się rozpocząć i powiadomić.
Kiedy używać RxJS?
Jeśli Twój projekt składa się z wielu zadań asynchronicznych, RxJS jest dobrym wyborem. Jest ładowany domyślnie z projektem Angular.
Zalety korzystania z RxJS
Oto zalety korzystania z RxJS -
RxJS może być używany z innymi bibliotekami i frameworkami JavaScript. Jest obsługiwany przez javascript, a także przez maszynopis. Kilka przykładów to Angular, ReactJS, Vuejs, nodejs itp.
RxJS to niesamowita biblioteka, jeśli chodzi o obsługę zadań asynchronicznych. RxJS używa obserwabli do pracy z programowaniem reaktywnym, które obsługuje asynchroniczne wywołania danych, wywołania zwrotne i programy oparte na zdarzeniach.
RxJS oferuje ogromną kolekcję operatorów matematycznych, transformacyjnych, filtrowania, narzędziowych, warunkowych, obsługi błędów, łączenia kategorii, które ułatwiają życie w przypadku programowania reaktywnego.
Wady korzystania z RxJS
Poniżej przedstawiono wady korzystania z RxJS -
Debugowanie kodu za pomocą obserwabli jest trochę trudne.
Gdy zaczniesz używać Observables, możesz zakończyć swój pełny kod zawinięty pod obserwałami.
W tym rozdziale zamierzamy zainstalować RxJS. Do pracy z RxJS potrzebujemy następującej konfiguracji -
- NodeJS
- Npm
- Instalacja pakietu RxJS
Instalacja NODEJS i NPM
Instalacja RxJS za pomocą npm jest bardzo łatwa. Musisz mieć zainstalowane nodejs i npm w swoim systemie. Aby sprawdzić, czy w systemie są zainstalowane NodeJS i npm, spróbuj wykonać następujące polecenie w wierszu polecenia.
E:\>node -v && npm -v
v10.15.1
6.4.1
W przypadku, gdy pobierasz wersję, oznacza to, że nodejs i npm są zainstalowane w twoim systemie, a wersja to 10 i 6 w systemie.
Jeśli nic nie drukuje, zainstaluj nodejs w swoim systemie. Aby zainstalować nodejs, przejdź do strony głównejhttps://nodejs.org/en/download/ of nodejs i zainstaluj pakiet oparty na systemie operacyjnym.
Strona pobierania nodejs będzie wyglądać następująco -
W zależności od systemu operacyjnego zainstaluj wymagany pakiet. Po zainstalowaniu nodejs, wraz z nim zostanie również zainstalowany npm. Aby sprawdzić, czy npm jest zainstalowany, czy nie, wpisz npm –v w terminalu. Powinien wyświetlić wersję pliku npm.
Instalacja pakietu RxJS
Aby rozpocząć instalację RxJS, najpierw utwórz folder o nazwie rxjsproj/ gdzie przećwiczymy wszystkie przykłady RxJS.
Gdy folder rxjsproj/ jest utworzony, uruchom polecenie npm init, do konfiguracji projektu, jak pokazano poniżej
E:\>mkdir rxjsproj
E:\>cd rxjsproj
E:\rxjsproj>npm init
Npm initpolecenie zada kilka pytań podczas wykonywania, po prostu naciśnij enter i kontynuuj. Po wykonaniu npm init zostanie utworzonypackage.json wewnątrz rxjsproj / jak pokazano poniżej -
rxjsproj/
package.json
Teraz możesz zainstalować rxjs za pomocą poniższego polecenia -
npm install ---save-dev rxjs
E:\rxjsproj>npm install --save-dev rxjs
npm notice created a lockfile as package-lock.json. You should commit this file.
npm WARN [email protected] No description
npm WARN [email protected] No repository field.
+ [email protected]
added 2 packages from 7 contributors and audited 2 packages in 21.89s
found 0 vulnerabilities
Skończyliśmy z instalacją RxJS. Spróbujmy teraz użyć RxJS, aby utworzyć foldersrc/ wewnątrz rxjsproj/
Więc teraz będziemy mieć strukturę folderów, jak pokazano poniżej -
rxjsproj/
node_modules/
src/
package.json
Wewnątrz src/ utwórz plik testrx.jsi napisz następujący kod -
testrx.js
import { of } from 'rxjs;
import { map } from 'rxjs/operators';
map(x => x * x)(of(1, 2, 3)).subscribe((v) => console.log(`Output is: ${v}`));
Kiedy idziemy wykonać powyższy kod w wierszu poleceń, używając polecenia - node testrx.js, wyświetli błąd podczas importu, ponieważ nodejs nie wie, co zrobić z importem.
Aby import działał z nodejs, musimy zainstalować pakiet modułów ES6 za pomocą npm, jak pokazano poniżej -
E:\rxjsproj\src>npm install --save-dev esm
npm WARN [email protected] No description
npm WARN [email protected] No repository field.
+ [email protected]
added 1 package from 1 contributor and audited 3 packages in 9.32s
found 0 vulnerabilities
Po zainstalowaniu pakietu możemy teraz wykonać testrx.js plik, jak pokazano poniżej -
E:\rxjsproj\src>node -r esm testrx.js
Output is: 1
Output is: 4
Output is: 9
Widzimy teraz wynik, który pokazuje, że RxJS jest zainstalowany i gotowy do użycia. Powyższa metoda pomoże nam przetestować RxJS w linii poleceń. W przypadku, gdybyś chciał przetestować RxJS w przeglądarce, potrzebowalibyśmy dodatkowych pakietów.
Testowanie RxJS w przeglądarce
Zainstaluj następujące pakiety w rxjsproj / folder -
npm install --save-dev babel-loader @babel/core @babel/preset-env webpack webpack-cli webpack-dev-server
E:\rxjsproj>npm install --save-dev babel-loader
@babel/core @babel/preset-env webpack webpack-cli webpack-dev-server
npm WARN [email protected] No description
npm WARN [email protected] No repository field.
npm WARN optional SKIPPING OPTIONAL DEPENDENCY: [email protected]
(node_modules\fsevents):
npm WARN notsup SKIPPING OPTIONAL DEPENDENCY: Unsupported platform for fsevents@
1.2.9: wanted {"os":"darwin","arch":"any"} (current: {"os":"win32","arch":"x64"})
+ [email protected]
+ [email protected]
+ @babel/[email protected]
+ @babel/[email protected]
+ [email protected]
+ [email protected]
added 675 packages from 373 contributors and audited 10225 packages in 255.567s
found 0 vulnerabilities
Aby uruchomić serwer w celu wykonania naszego pliku Html, użyjemy serwera webpack. Polecenie „publikuj” w pliku package.json pomoże nam rozpocząć, a także spakować wszystkie pliki js za pomocą pakietu webpack. Spakowane pliki js, które są naszym ostatecznym plikiem js do użycia, są zapisywane w folderze path / dev .
Aby użyć webpacka, musimy uruchomić npm run publish polecenie, a polecenie jest dodawane w package.json, jak pokazano poniżej -
Package.json
{
"name": "rxjsproj",
"version": "1.0.0",
"description": "",
"main": "index.js",
"scripts": {
"publish":"webpack && webpack-dev-server --output-public=/dev/",
"test": "echo \"Error: no test specified\" && exit 1"
},
"author": "",
"license": "ISC",
"devDependencies": {
"@babel/core": "^7.6.0",
"@babel/preset-env": "^7.6.0",
"babel-loader": "^8.0.6",
"esm": "^3.2.25",
"rxjs": "^6.5.3",
"webpack": "^4.39.3",
"webpack-cli": "^3.3.8",
"webpack-dev-server": "^3.8.0"
}
}
Aby pracować z pakietem webpack, musimy najpierw utworzyć plik o nazwie webpack.config.js, który zawiera szczegóły konfiguracyjne pakietu webpack.
Szczegóły w pliku są następujące -
var path = require('path');
module.exports = {
entry: {
app: './src/testrx.js'
},
output: {
path: path.resolve(__dirname, 'dev'),
filename: 'main_bundle.js'
},
mode:'development',
module: {
rules: [
{
test:/\.(js)$/,
include: path.resolve(__dirname, 'src'),
loader: 'babel-loader',
query: {
presets: ['@babel/preset-env']
}
}
]
}
};
Struktura pliku jest taka, jak pokazano powyżej. Rozpoczyna się ścieżką, która zawiera szczegóły dotyczące bieżącej ścieżki.
var path = require('path'); //gives the current path
Następny jest obiekt module.exports, który ma właściwości wpisu, wyjścia i modułu. Wejście jest punktem wyjścia. Tutaj musimy podać plik startowy js, który chcemy skompilować.
entry: {
app: './src/testrx.js'
},
path.resolve (_dirname, 'src / testrx.js') - wyszuka folder src w katalogu, a testrx.js w tym folderze.
Wynik
output: {
path: path.resolve(__dirname, 'dev'),
filename: 'main_bundle.js'
},
Dane wyjściowe to obiekt ze szczegółami ścieżki i nazwy pliku. Ścieżka będzie przechowywać folder, w którym będzie przechowywany skompilowany plik, a nazwa pliku wskaże nazwę ostatecznego pliku, który ma być użyty w pliku .html.
Moduł
module: {
rules: [
{
test:/\.(js)$/,
include: path.resolve(__dirname, 'src'),
loader: 'babel-loader',
query: {
presets: ['@babel/preset-env']
}
}
]
}
Modulejest obiektem ze szczegółami reguł, który ma właściwości, np. test, dołącz, ładowacz, zapytanie. Test będzie zawierał szczegóły wszystkich plików js kończących się na .js i .jsx. Ma wzorzec, który będzie szukał .js na końcu w podanym punkcie wejścia.
Include informuje folder, który ma być używany do przeglądania plików.
The loader używa programu ładującego babel do kompilowania kodu.
The queryma predefiniowane ustawienia właściwości, które są tablicą o wartości „@ babel / preset-env”. Kod zostanie przetransponowany zgodnie z potrzebnym środowiskiem ES.
Ostateczna struktura folderów będzie następująca -
rxjsproj/
node_modules/
src/
testrx.js
index.html
package.json
webpack.config.js
Uruchom polecenie
npm run publishutworzy folder dev / z plikiem main_bundle.js. Serwer zostanie uruchomiony i możesz przetestować swój plik index.html w przeglądarce, jak pokazano poniżej.
Otwórz przeglądarkę i naciśnij adres URL - http://localhost:8080/
Dane wyjściowe są wyświetlane w konsoli.
W tym samouczku używamy RxJS w wersji 6. RxJS jest powszechnie używany do radzenia sobie z programowaniem reaktywnym i częściej używany z Angular, ReactJS. Angular 6 domyślnie ładuje rxjs6.
Wersja 5 RxJS była obsługiwana inaczej niż wersja 6. Kod ulegnie awarii w przypadku aktualizacji RxJS 5 do 6. W tym rozdziale zobaczymy różnicę w sposobach obsługi aktualizacji wersji.
Jeśli aktualizujesz RxJS do 6 i nie chcesz wprowadzać zmian w kodzie, możesz to również zrobić i będziesz musiał zainstalować następujący pakiet.
npm install --save-dev rxjs-compact
Ten pakiet zadba o zapewnienie kompatybilności wstecznej, a stary kod będzie działał dobrze z RxJS w wersji 6. Jeśli chcesz wprowadzić zmiany w kodzie, które działają dobrze z RxJS 6, oto zmiany, które należy wprowadzić.
Pakiety dla operatorów, obserwabli, temat zostały zrestrukturyzowane, w związku z czym główne zmiany dotyczą importu i zostały wyjaśnione poniżej.
Import dla operatorów
Zgodnie z wersją 5 dla operatorów należy dołączyć następujące zestawienia importu -
import 'rxjs/add/operator/mapTo'
import 'rxjs/add/operator/take'
import 'rxjs/add/operator/tap'
import 'rxjs/add/operator/map'
W wersji 6 RxJS import będzie wyglądał następująco -
import {mapTo, take, tap, map} from "rxjs/operators"
Import metod do tworzenia Observables
Zgodnie z wersją 5, podczas pracy z Observables, należy uwzględnić następujące metody importu -
import "rxjs/add/observable/from";
import "rxjs/add/observable/of";
import "rxjs/add/observable/fromEvent";
import "rxjs/add/observable/interval";
W wersji 6 RxJS import będzie wyglądał następująco -
import {from, of, fromEvent, interval} from 'rxjs';
Import observables
W RxJS w wersji 5, podczas pracy z Observables, należy dołączyć następujące instrukcje importu -
import { Observable } from 'rxjs/Observable'
W RxJS w wersji 6 import będzie wyglądał następująco -
import { Observable } from 'rxjs'
Import przedmiotu
W RxJS w wersji 5 temat należy umieścić w następujący sposób -
import { Subject} from 'rxjs/Subject'
W RxJS w wersji 6 import będzie wyglądał następująco -
import { Subject } from 'rxjs'
Jak używać operatorów w RxJS 6?
pipe() methodjest dostępny na utworzonej obserwowalnej. Jest dodawany do RxJS od wersji 5.5. Używając pipe (), możesz teraz pracować na wielu operatorach razem w kolejności sekwencyjnej. W ten sposób operatory zostały użyte w RxJS w wersji 5.
Przykład
import "rxjs/add/observable/from";
import 'rxjs/add/operator/max'
let list1 = [1, 6, 15, 10, 58, 2, 40];
from(list1).max((a,b)=>a-b).subscribe(x => console.log("The Max value is "+x));
Od wersji RxJS 5.5 i nowszych musimy użyć pipe () do wykonania operatora -
Przykład
import { from } from 'rxjs';
import { max } from 'rxjs/operators';
from(list1).pipe(max((a,b)=>a-b)).subscribe(x => console.log(
"The Max value is "+x)
);
Zmieniono nazwy operatorów
Podczas restrukturyzacji pakietów zmieniono nazwy niektórych operatorów, ponieważ były w konflikcie lub pasowały do słów kluczowych javascript. Lista jest taka, jak pokazano poniżej -
Operator | Zmieniono nazwę na |
---|---|
zrobić() | kran() |
łapać() | catchError () |
przełącznik() | switchAll () |
Wreszcie() | sfinalizować() |
rzucać() | throwError () |
Obserwowalna to funkcja, która tworzy obserwatora i dołącza go do źródła, z którego oczekuje się wartości, na przykład kliknięć, zdarzeń myszy z elementu dom lub żądania HTTP itp.
Observer is an object with callback functions, który zostanie wywołany, gdy nastąpi interakcja z Observable, tj. źródło zadziałało na przykład kliknięcie przycisku, żądanie HTTP itp.
W tym rozdziale omówimy następujące tematy -
- Utwórz obserwowalne
- Subskrybuj obserwowalne
- Wykonaj obserwowalne
Utwórz obserwowalne
Obsługę można utworzyć za pomocą konstruktora obserwo walnego, a także za pomocą metody tworzenia obserwowalnych i przekazując funkcję subscribe jako argument, jak pokazano poniżej -
testrx.js
import { Observable } from 'rxjs';
var observable = new Observable(
function subscribe(subscriber) {
subscriber.next("My First Observable")
}
);
Stworzyliśmy obserwowalny i dodaliśmy wiadomość „My First Observable” za pomocą subscriber.next metoda dostępna w Observable.
Możemy również stworzyć Observable za pomocą metody Observable.create (), jak pokazano poniżej -
testrx.js
import { Observable } from 'rxjs';
var observer = Observable.create(
function subscribe(subscriber) {
subscriber.next("My First Observable")
}
);
Subskrybuj obserwowalne
Możesz subskrybować obserwowalne w następujący sposób -
testrx.js
import { Observable } from 'rxjs';
var observer = new Observable(
function subscribe(subscriber) {
subscriber.next("My First Observable")
}
);
observer.subscribe(x => console.log(x));
Kiedy obserwator zostanie zasubskrybowany, rozpocznie wykonywanie Observable.
Oto, co widzimy w konsoli przeglądarki -
Wykonaj obserwowalne
Obserwowalny jest wykonywany, gdy jest subskrybowany. Obserwator to obiekt z trzema metodami, które są powiadamiane,
next() - Ta metoda wysyła wartości takie jak liczba, ciąg znaków, obiekt itp.
complete() - Ta metoda nie wysyła żadnej wartości i wskazuje obserwowalne jako zakończone.
error() - Ta metoda wyśle błąd, jeśli wystąpi.
Stwórzmy obserwowalne ze wszystkimi trzema powiadomieniami i wykonajmy to samo.
testrx.js
import { Observable } from 'rxjs';
var observer = new Observable(
function subscribe(subscriber) {
try {
subscriber.next("My First Observable");
subscriber.next("Testing Observable");
subscriber.complete();
} catch(e){
subscriber.error(e);
}
}
);
observer.subscribe(x => console.log(x), (e)=>console.log(e),
()=>console.log("Observable is complete"));
W powyższym kodzie dodaliśmy następną, pełną i błędną metodę.
try{
subscriber.next("My First Observable");
subscriber.next("Testing Observable");
subscriber.complete();
} catch(e){
subscriber.error(e);
}
Aby wykonać następny, kompletny i błąd, musimy wywołać metodę subscribe, jak pokazano poniżej -
observer.subscribe(x => console.log(x), (e)=>console.log(e),
()=>console.log("Observable is complete"));
Metoda błędu zostanie wywołana tylko wtedy, gdy wystąpi błąd.
To jest wynik widoczny w przeglądarce -
Operatorzy są ważną częścią RxJS. Operator jest czystą funkcją, która przyjmuje obserwowalne jako dane wejściowe, a wyjście jest również obserwowalne.
Praca z operatorami
Operator jest czystą funkcją, która przyjmuje obserwowalne jako dane wejściowe, a wyjście jest również obserwowalne.
Do pracy z operatorami potrzebujemy metody pipe ().
Przykład użycia pipe ()
let obs = of(1,2,3); // an observable
obs.pipe(
operator1(),
operator2(),
operator3(),
operator3(),
)
W powyższym przykładzie stworzyliśmy obserwowalne użycie of()metoda, która przyjmuje wartości 1, 2 i 3. Teraz na tym obserwowalnym można wykonać inną operację przy użyciu dowolnej liczby operatorów przy użyciu metody pipe (), jak pokazano powyżej. Wykonywanie operatorów będzie się odbywać sekwencyjnie na danym obserwowalnym.
Poniżej znajduje się działający przykład -
import { of } from 'rxjs';
import { map, reduce, filter } from 'rxjs/operators';
let test1 = of(1, 2, 3, 4, 5, 6, 7, 8, 9, 10);
let case1 = test1.pipe(
filter(x => x % 2 === 0),
reduce((acc, one) => acc + one, 0)
)
case1.subscribe(x => console.log(x));
Wynik
30
W powyższym przykładzie użyliśmy operatora filtru, który filtruje liczby parzyste, a następnie użyliśmy reduce() operator, który doda parzyste wartości i da wynik po zasubskrybowaniu.
Oto lista Observables, które zamierzamy omówić.
- Creation
- Mathematical
- Join
- Transformation
- Filtering
- Utility
- Conditional
- Multicasting
- Obsługa błędów
Operatory tworzenia
Poniżej znajdują się operatory, które omówimy w kategorii Operator tworzenia -
Sr.No | Operator i opis |
---|---|
1 | Ajax Ten operator wykona żądanie AJAX dla podanego adresu URL. |
2 | od Ten operator utworzy obserwowalny z tablicy, obiekt podobny do tablicy, obietnicę, obiekt iterowalny lub obiekt podobny do obserwowalnego. |
3 | fromEvent Ten operator da dane wyjściowe jako obserwowalne, które mają być użyte w elementach emitujących zdarzenie, na przykład przyciski, kliknięcia itp. |
4 | fromEventPattern Ten operator utworzy obserwowalne z funkcji wejściowej, która jest używana do rejestrowania programów obsługi zdarzeń. |
5 | interwał Ten operator utworzy Observable dla każdego czasu dla podanego czasu. |
6 | z Ten operator weźmie przekazane argumenty i przekształci je w obserwowalne. |
7 | zasięg Ten operator utworzy Observable, który da ci sekwencję liczb na podstawie podanego zakresu. |
8 | throwError Ten operator utworzy obserwowalny, który powiadomi o błędzie. |
9 | regulator czasowy Ten operator utworzy obserwowalny, który wyemituje wartość po upływie limitu czasu, a wartość będzie rosła po każdym wywołaniu. |
10 | iif Ten operator zdecyduje, które Observable zostanie zasubskrybowane. |
Operatory matematyczne
Poniżej przedstawiono operatory, które omówimy w kategorii Operator matematyczny -
Sr.No | Operator i opis |
---|---|
1 | Liczyć Operator count () przyjmuje Observable z wartościami i konwertuje go na Observable, który da pojedynczą wartość |
2 | Maks Metoda Max przyjmie obserwowalną ze wszystkimi wartościami i zwróci obserwowalną z wartością maksymalną |
3 | Min Min metoda przyjmie obserwowalną ze wszystkimi wartościami i zwróci obserwowalną z wartością minimalną. |
4 | Zmniejszyć W operatorze redukuj, funkcja akumulatora jest używana na wejściu obserwowalnym, a funkcja akumulatora zwróci skumulowaną wartość w postaci obserwowalnej, z opcjonalną wartością ziarna przekazaną do funkcji akumulatora. Funkcja redukuj () przyjmie 2 argumenty, jedną funkcję akumulującą, a drugą wartość początkową. |
Dołącz do operatorów
Poniżej przedstawiono operatory, które omówimy w kategorii Operator przyłączenia.
Sr.No | Operator i opis |
---|---|
1 | concat Ten operator sekwencyjnie wyemituje Observable podane jako dane wejściowe i przejdzie do następnego. |
2 | forkJoin Ten operator zostanie przyjęty w tablicy lub obiekcie dyktowania jako dane wejściowe i będzie czekał na zakończenie obserwacji i zwróci ostatnie wartości wyemitowane przez daną obserwowalną. |
3 | łączyć Operator ten weźmie obserwowalne dane wejściowe i wyemituje wszystkie wartości z tego, co obserwowalne, i wyemituje jeden obserwowalny wynik. |
4 | wyścigi Zwróci obserwowalne, które będzie lustrzaną kopią pierwszego obserwowalnego źródła. |
Operatory transformacji
Poniżej przedstawiono operatory, które omówimy w kategorii Operator transformacji.
Sr.No | Operator i opis |
---|---|
1 | bufor Bufor działa na obserwowalnym i przyjmuje argument jako obserwowalny. Zacznie buforować wartości emitowane w swojej pierwotnej obserwowalnej tablicy i wyemituje to samo, gdy wyemituje obserowalny wzięty jako argument. Po tym, jak obserwowalne zostaną wzięte jako wyemitowane argumenty, bufor jest resetowany i zaczyna ponownie buforować oryginał, aż pojawi się obserwowalny sygnał wejściowy i powtórzy się ten sam scenariusz. |
2 | bufferCount W przypadku operatora buffercount () zbierze on wartości z obserwowalnego, na którym jest wywoływany i wyemituje to samo, gdy rozmiar bufora podany do buffercount będzie zgodny. |
3 | czas bufora Jest to podobne do bufferCount, więc tutaj zbierze wartości z obserwowalnego, na którym jest wywoływana, i wyemituje bufferTimeSpan. Przyjmuje 1 argument, tj . BufferTimeSpan . |
4 | bufferToggle W przypadku bufferToggle () przyjmuje 2 argumenty, otwarcia i selektor zamknięcia. Argumenty otwierające są subskrybowane lub obiecują uruchomienie bufora, a drugi argument closeSelector jest ponownie subskrybowany lub obiecuje wskaźnik zamknięcia bufora i wyemitowania zebranych wartości. |
5 | buforWhen Ten operator poda wartości w postaci tablicowej, przyjmuje jeden argument jako funkcję, która zdecyduje, kiedy zamknąć, wyemitować i zresetować bufor. |
6 | rozszerzać Operator expand przyjmuje funkcję jako argument, który jest stosowany do obserwowalnego źródła rekurencyjnie, a także do obserwowalnego wyjścia. Ostateczna wartość jest obserwowalna. |
7 | Grupuj według W operatorze groupBy dane wyjściowe są grupowane na podstawie określonego warunku, a te elementy grupowe są emitowane jako GroupedObservable. |
8 | mapa W przypadku operatora mapy, funkcja projektu jest stosowana do każdej wartości w źródle Observable i ten sam wynik jest emitowany jako Observable. |
9 | Mapa do Stała wartość jest podawana jako wyjście wraz z Observable za każdym razem, gdy źródło Observable emituje wartość. |
10 | mergeMap W przypadku operatora mergeMap, funkcja projektu jest stosowana do każdej wartości źródłowej, a jej wynik jest łączony z danymi wyjściowymi Observable. |
11 | switchMap W przypadku operatora switchMap, funkcja projektu jest stosowana do każdej wartości źródłowej, a jej wynik jest łączony z danymi wyjściowymi Observable, a podana wartość jest ostatnią przewidywaną Observable. |
12 | okno Pobiera argumentowe granice okna, które są obserwowalne i zwracają zagnieżdżone obserwowalne za każdym razem, gdy dane granice okna emitują |
Operatory filtrowania
Poniżej przedstawiono operatory, które omówimy w kategorii operatorów filtrujących.
Sr.No | Operator i opis |
---|---|
1 | Obalić Wartość emitowana ze źródła Obserwowalna po pewnym czasie, a emisja jest określana przez inny sygnał wejściowy określony jako Obserwowalny lub obiecujący. |
2 | debounceTime Wyemituje wartość z obserwowalnego źródła dopiero po upływie tego czasu. |
3 | odrębny Ten operator poda wszystkie wartości z obserwowalnego źródła, które są różne w porównaniu z poprzednią wartością. |
4 | elementAt Ten operator poda pojedynczą wartość z obserwowalnego źródła na podstawie podanego indeksu. |
5 | filtr Ten operator odfiltruje wartości ze źródła Observable na podstawie podanej funkcji predykatu. |
6 | pierwszy Ten operator poda pierwszą wartość wyemitowaną przez źródło Observable. |
7 | ostatni, ubiegły, zeszły Ten operator poda ostatnią wartość wyemitowaną przez źródło Observable. |
8 | ignoreElements Ten operator zignoruje wszystkie wartości ze źródła Observable i wykona tylko wywołania funkcji zakończenia lub błędu wywołania zwrotnego. |
9 | próba Ten operator poda najnowszą wartość ze źródła Observable, a wynik będzie zależał od przekazanego argumentu. |
10 | pominąć Ten operator zwróci obserwowalną, która pominie pierwsze wystąpienie elementów licznika przyjętych jako dane wejściowe. |
11 | przepustnica Ten operator wyświetli, jak również zignoruje wartości ze źródła obserwowalne przez czas określony przez funkcję wejściową, przyjętą jako argument, i ten sam proces zostanie powtórzony. |
Operatorzy narzędzi
Poniżej przedstawiono operatory, które omówimy w kategorii operatorów usług użyteczności publicznej.
Sr.No | Operator i opis |
---|---|
1 | kran Ten operator będzie miał dane wyjściowe, takie same jak obserwowalne źródło i może być używany do rejestrowania wartości dla użytkownika z obserwowalnego. Główna wartość, ewentualny błąd lub ukończenie zadania. |
2 | opóźnienie Ten operator opóźnia wartości emitowane ze źródła Observable na podstawie podanego limitu czasu. |
3 | delayWhen Ten operator opóźnia wartości emitowane ze źródła Observable na podstawie limitu czasu z innego obserwowalnego wziętego jako dane wejściowe. |
4 | followOn Ten operator oparty na harmonogramie wejściowym ponownie wyemituje powiadomienia ze źródła Observable. |
5 | subscribeOn Ten operator pomaga asynchronicznie subskrybować źródło Observable na podstawie harmonogramu przyjętego jako dane wejściowe. |
6 | Przedział czasowy Ten operator zwróci obiekt, który zawiera bieżącą wartość i czas, jaki upłynął między bieżącą i poprzednią wartością, który jest obliczany przy użyciu danych wejściowych harmonogramu. |
7 | znak czasu Zwraca znacznik czasu wraz z wartością wyemitowaną ze źródła Observable, która informuje o czasie, w którym wartość została wyemitowana. |
8 | koniec czasu Ten operator zgłosi błąd, jeśli źródło Observable nie wyemituje wartości po określonym czasie. |
9 | toArray Zbiera wszystkie wartości źródłowe z Observable i wyprowadza je jako tablicę po zakończeniu działania źródła. |
Operatory warunkowe
Poniżej przedstawiono operatory, które omówimy w kategorii operatorów warunkowych.
Sr.No | Operator i opis |
---|---|
1 | defaultIfEmpty Ten operator zwróci wartość domyślną, jeśli obserwowalne źródło jest puste. |
2 | każdy Zwróci Observable na podstawie funkcji wejściowej, która spełnia warunek dla każdej wartości w źródle Observable. |
3 | odnaleźć To zwróci obserwowalne, gdy pierwsza wartość źródła Observable spełnia warunek dla funkcji predykatu przyjętej jako dane wejściowe. |
4 | findIndex Ten operator oparty na harmonogramie wejściowym ponownie wyemituje powiadomienia ze źródła Observable. |
5 | jest pusty Ten operator da wynik jako prawdziwy, jeśli obserwowalne dane wejściowe przechodzą do pełnego wywołania zwrotnego bez emitowania żadnych wartości, lub jako fałsz, jeśli obserwowalne dane wejściowe emitują jakiekolwiek wartości. |
Operatory multiemisji
Poniżej przedstawiono operatory, które omówimy w kategorii operatorów multiemisji.
Sr.No | Operator i opis |
---|---|
1 | multiemisja Operator multiemisji udostępnia pojedynczą subskrypcję utworzoną innym abonentom. Parametry, które przyjmuje multiemisja, są podmiotem lub metodą fabryczną, która zwraca ConnectableObservable, która ma metodę connect (). Aby zasubskrybować, należy wywołać metodę connect (). |
2 | publikować Ten operator zwraca ConnectableObservable i musi użyć metody connect (), aby zasubskrybować obserwowalne. |
3 | publikujBehavior PublishingBehaviour korzysta z BehaviourSubject i zwraca ConnectableObservable. Należy użyć metody connect (), aby zasubskrybować utworzony obiekt obserwowalny. |
4 | publikujLast PublishingBehaviour korzysta z AsyncSubject i zwraca ConnectableObservable. Należy użyć metody connect (), aby zasubskrybować utworzony obiekt obserwowalny. |
5 | publikujReplay PublishingReplay korzysta z obiektu behawioralnego, w którym może buforować wartości i odtwarzać je nowym subskrybentom oraz zwracać ConnectableObservable. Należy użyć metody connect (), aby zasubskrybować utworzony obiekt obserwowalny. |
6 | dzielić Jest to alias dla operatora mutlicast (), z tą różnicą, że nie trzeba ręcznie wywoływać metody connect (), aby rozpocząć subskrypcję. |
Operatory obsługi błędów
Poniżej przedstawiono operatory, które omówimy w kategorii operatorów obsługi błędów.
Sr.No | Operator i opis |
---|---|
1 | catchError Ten operator zajmuje się wychwytywaniem błędów w źródle Observable, zwracając nowy Observable lub błąd. |
2 | spróbować ponownie Ten operator zajmie się ponowieniem próby z powrotem na źródle Observable, jeśli wystąpi błąd, a ponowna próba zostanie wykonana na podstawie podanej liczby wejściowej. |
Kiedy to, co obserwowalne jest tworzone, aby wykonać to, co obserwowalne, musimy je zapisać.
operator count ()
Oto prosty przykład, jak zasubskrybować obserwowalny.
Przykład 1
import { of } from 'rxjs';
import { count } from 'rxjs/operators';
let all_nums = of(1, 7, 5, 10, 10, 20);
let final_val = all_nums.pipe(count());
final_val.subscribe(x => console.log("The count is "+x));
Wynik
The count is 6
Subskrypcja ma jedną metodę o nazwie unsubscribe (). Wywołanie metody unsubscribe () usunie wszystkie zasoby używane dla tego obserwowalnego, tj. To, co obserwowalne, zostanie anulowane. Oto działający przykład użycia metody unsubscribe ().
Przykład 2
import { of } from 'rxjs';
import { count } from 'rxjs/operators';
let all_nums = of(1, 7, 5, 10, 10, 20);
let final_val = all_nums.pipe(count());
let test = final_val.subscribe(x => console.log("The count is "+x));
test.unsubscribe();
Subskrypcja jest przechowywana w zmiennej test. Użyliśmy test.unsubscribe () the obserable.
Wynik
The count is 6
Temat jest obserwowalny, który może być rozsyłany grupowo, czyli rozmawiać z wieloma obserwatorami. Rozważmy przycisk z detektorem zdarzenia, funkcja dołączona do zdarzenia za pomocą detektora dodawania jest wywoływana za każdym razem, gdy użytkownik kliknie przycisk. Podobna funkcjonalność dotyczy również tematu.
W tym rozdziale omówimy następujące tematy -
- Utwórz temat
- Jaka jest różnica między obserwowalnymi a podmiotowymi?
- Temat zachowania
- Powtórz temat
- AsyncSubject
Utwórz temat
Aby pracować z tematem, musimy zaimportować temat, jak pokazano poniżej -
import { Subject } from 'rxjs';
Możesz utworzyć obiekt podmiotu w następujący sposób -
const subject_test = new Subject();
Obiekt jest obserwatorem, który ma trzy metody -
- next(v)
- error(e)
- complete()
Zasubskrybuj temat
Możesz utworzyć wiele subskrypcji na ten temat, jak pokazano poniżej -
subject_test.subscribe({
next: (v) => console.log(`From Subject : ${v}`)
});
subject_test.subscribe({
next: (v) => console.log(`From Subject: ${v}`)
});
Subskrypcja jest rejestrowana w obiekcie podmiotu, tak jak omawialiśmy wcześniej addlistener.
Przekazywanie danych podmiotowi
Możesz przekazać dane podmiotowi utworzonemu za pomocą metody next ().
subject_test.next("A");
Dane zostaną przekazane wszystkim abonamentom dodanym na ten temat.
Przykład
Oto roboczy przykład tematu -
import { Subject } from 'rxjs';
const subject_test = new Subject();
subject_test.subscribe({
next: (v) => console.log(`From Subject : ${v}`)
});
subject_test.subscribe({
next: (v) => console.log(`From Subject: ${v}`)
});
subject_test.next("A");
subject_test.next("B");
Obiekt subject_test jest tworzony przez wywołanie nowej metody Subject (). Obiekt subject_test odwołuje się do metod next (), error () i complete (). Dane wyjściowe powyższego przykładu pokazano poniżej -
Wynik
Możemy użyć metody complete (), aby zatrzymać wykonywanie podmiotu, jak pokazano poniżej.
Przykład
import { Subject } from 'rxjs';
const subject_test = new Subject();
subject_test.subscribe({
next: (v) => console.log(`From Subject : ${v}`)
});
subject_test.subscribe({
next: (v) => console.log(`From Subject: ${v}`)
});
subject_test.next("A");
subject_test.complete();
subject_test.next("B");
Po wywołaniu complete następna metoda wywoływana później nie jest wywoływana.
Wynik
Zobaczmy teraz, jak wywołać metodę error ().
Przykład
Poniżej znajduje się działający przykład -
import { Subject } from 'rxjs';
const subject_test = new Subject();
subject_test.subscribe({
error: (e) => console.log(`From Subject : ${e}`)
});
subject_test.subscribe({
error: (e) => console.log(`From Subject : ${e}`)
});
subject_test.error(new Error("There is an error"));
Wynik
Jaka jest różnica między obserwowalnymi a podmiotowymi?
Obserwowalny porozmawia jeden z drugim, z abonentem. Za każdym razem, gdy subskrybujesz obserwowalne, wykonanie rozpocznie się od zera. Weź wywołanie HTTP wykonane przy użyciu ajax i 2 subskrybentów wywołujących obserwowalne. Na karcie sieci przeglądarki zobaczysz 2 żądania HttpHttp.
Przykład
Oto działający przykład tego samego -
import { ajax } from 'rxjs/ajax';
import { map } from 'rxjs/operators';
let final_val = ajax('https://jsonplaceholder.typicode.com/users').pipe(map(e => e.response));
let subscriber1 = final_val.subscribe(a => console.log(a));
let subscriber2 = final_val.subscribe(a => console.log(a));
Wynik
Teraz problem polega na tym, że chcemy, aby te same dane były udostępniane, ale nie kosztem 2 wywołań HTTP. Chcemy wykonać jedno połączenie HTTP i udostępnić dane abonentom.
Będzie to możliwe za pomocą przedmiotów. Jest to obserwowalne, które mogą być rozsyłane grupowo, tj. Rozmawiać z wieloma obserwatorami. Może dzielić wartość między subskrybentów.
Przykład
Oto działający przykład z użyciem przedmiotów -
import { Subject } from 'rxjs';
import { ajax } from 'rxjs/ajax';
import { map } from 'rxjs/operators';
const subject_test = new Subject();
subject_test.subscribe({
next: (v) => console.log(v)
});
subject_test.subscribe({
next: (v) => console.log(v)
});
let final_val = ajax('https://jsonplaceholder.typicode.com/users').pipe(map(e => e.response));
let subscriber = final_val.subscribe(subject_test);
Wynik
Teraz możesz zobaczyć tylko jedno połączenie HTTP i te same dane są udostępniane między wywoływanymi abonentami.
Temat zachowania
Temat zachowania poda ci ostatnią wartość po wywołaniu.
Możesz stworzyć temat zachowania, jak pokazano poniżej -
import { BehaviorSubject } from 'rxjs';
const subject = new BehaviorSubject("Testing Behaviour Subject");
// initialized the behaviour subject with value:Testing Behaviour Subject
Przykład
Oto działający przykład użycia tematu zachowania -
import { BehaviorSubject } from 'rxjs';
const behavior_subject = new BehaviorSubject("Testing Behaviour Subject");
// 0 is the initial value
behavior_subject.subscribe({
next: (v) => console.log(`observerA: ${v}`)
});
behavior_subject.next("Hello");
behavior_subject.subscribe({
next: (v) => console.log(`observerB: ${v}`)
});
behavior_subject.next("Last call to Behaviour Subject");
Wynik
Powtórz temat
Obiekt powtórki jest podobny do tematu zachowania, w którym może buforować wartości i odtwarzać to samo nowym subskrybentom.
Przykład
Oto działający przykład tematu powtórki -
import { ReplaySubject } from 'rxjs';
const replay_subject = new ReplaySubject(2);
// buffer 2 values but new subscribers
replay_subject.subscribe({
next: (v) => console.log(`Testing Replay Subject A: ${v}`)
});
replay_subject.next(1);
replay_subject.next(2);
replay_subject.next(3);
replay_subject.subscribe({
next: (v) => console.log(`Testing Replay Subject B: ${v}`)
});
replay_subject.next(5);
Użyta wartość bufora dla tematu powtórki to 2. Więc ostatnie dwie wartości zostaną zbuforowane i użyte dla nowych wywoływanych abonentów.
Wynik
AsyncSubject
W przypadku AsyncSubject ostatnia wywołana wartość jest przekazywana do subskrybenta i zostanie to zrobione dopiero po wywołaniu metody complete ().
Przykład
Oto działający przykład tego samego -
import { AsyncSubject } from 'rxjs';
const async_subject = new AsyncSubject();
async_subject.subscribe({
next: (v) => console.log(`Testing Async Subject A: ${v}`)
});
async_subject.next(1);
async_subject.next(2);
async_subject.complete();
async_subject.subscribe({
next: (v) => console.log(`Testing Async Subject B: ${v}`)
});
Tutaj, przed wywołaniem complete, ostatnią wartością przekazywaną podmiotowi jest 2 i taka sama, jaką otrzymali subskrybenci.
Wynik
Harmonogram kontroluje wykonanie subskrypcji, kiedy ma się rozpocząć i powiadomić.
Aby skorzystać z harmonogramu, potrzebujemy:
import { Observable, asyncScheduler } from 'rxjs';
import { observeOn } from 'rxjs/operators';
Oto działający przykład, w którym użyjemy harmonogramu, który zadecyduje o wykonaniu.
Przykład
import { Observable, asyncScheduler } from 'rxjs';
import { observeOn } from 'rxjs/operators';
var observable = new Observable(function subscribe(subscriber) {
subscriber.next("My First Observable");
subscriber.next("Testing Observable");
subscriber.complete();
}).pipe(
observeOn(asyncScheduler)
);
console.log("Observable Created");
observable.subscribe(
x => console.log(x),
(e)=>console.log(e),
()=>console.log("Observable is complete")
);
console.log('Observable Subscribed');
Wynik
Bez harmonogramu dane wyjściowe wyglądałyby tak, jak pokazano poniżej -
W tym rozdziale zobaczymy, jak używać RxJs z Angular. Nie będziemy tutaj wchodzić w proces instalacji Angular, aby dowiedzieć się o instalacji kątowej, skorzystaj z tego linku -https://www.tutorialspoint.com/angular7/angular7_environment_setup.htm
Będziemy bezpośrednio pracować na przykładzie, w którym do ładowania danych użyjemy Ajax z RxJS.
Przykład
app.component.ts
import { Component } from '@angular/core';
import { environment } from './../environments/environment';
import { ajax } from 'rxjs/ajax';
import { map } from 'rxjs/operators'
@Component({
selector: 'app-root',
templateUrl: './app.component.html',
styleUrls: ['./app.component.css']
})
export class AppComponent {
title = '';
data;
constructor() {
this.data = "";
this.title = "Using RxJs with Angular";
let a = this.getData();
}
getData() {
const response =
ajax('https://jsonplaceholder.typicode.com/users')
.pipe(map(e => e.response));
response.subscribe(res => {
console.log(res);
this.data = res;
});
}
}
app.component.html
<div>
<h3>{{title}}</h3>
<ul *ngFor="let i of data">
<li>{{i.id}}: {{i.name}}</li>
</ul>
</div>
<router-outlet></router-outlet>
Użyliśmy ajax z RxJS, który załaduje dane z tego adresu URL -https://jsonplaceholder.typicode.com/users.
Po kompilacji wyświetlacz wygląda tak, jak pokazano poniżej -
W tym rozdziale zobaczymy, jak używać RxJs z ReactJS. Nie będziemy tutaj wchodzić w proces instalacji Reactjs, aby dowiedzieć się o instalacji ReactJS, skorzystaj z tego łącza:https://www.tutorialspoint.com/reactjs/reactjs_environment_setup.htm
Przykład
Będziemy bezpośrednio pracować na poniższym przykładzie, gdzie użyjemy Ajax z RxJS do załadowania danych.
index.js
import React, { Component } from "react";
import ReactDOM from "react-dom";
import { ajax } from 'rxjs/ajax';
import { map } from 'rxjs/operators';
class App extends Component {
constructor() {
super();
this.state = { data: [] };
}
componentDidMount() {
const response = ajax('https://jsonplaceholder.typicode.com/users').pipe(map(e => e.response));
response.subscribe(res => {
this.setState({ data: res });
});
}
render() {
return (
<div>
<h3>Using RxJS with ReactJS</h3>
<ul>
{this.state.data.map(el => (
<li>
{el.id}: {el.name}
</li>
))}
</ul>
</div>
);
}
}
ReactDOM.render(<App />, document.getElementById("root"));
index.html
<!DOCTYPE html>
<html>
<head>
<meta charset = "UTF-8" />
<title>ReactJS Demo</title>
<head>
<body>
<div id = "root"></div>
</body>
</html>
Użyliśmy ajax z RxJS, który będzie ładował dane z tego adresu URL -https://jsonplaceholder.typicode.com/users.
Podczas kompilacji ekran wygląda jak poniżej -