AsĂŒnkroonne programmeerimine JavaScriptis. (Callback, Promise, RxJs)

Tere kĂ”igile. Siin on Omelnicki Sergei. Hiljuti viis ma lĂ€bi voogesituse reaktiivse programmeerimise teemal, kus rÀÀkisin asĂŒnkroonsusest JavaScriptis. TĂ€na sooviksin selle materjali kokku vĂ”tta.

AsĂŒnkroonne programmeerimine JavaScriptis. (Callback, Promise, RxJs)

Aga enne, kui alustame pÔhiteemat, peame tegema sissejuhatuse. Niisiis, alustame definitsioonidest: mis on virn ja jÀrjekord?
Virn — see on kollektsioon, mille elemendid saadakse "viimane sisse, esimene vĂ€lja" LIFO pĂ”himĂ”ttel.
JĂ€rjekord — see on kollektsioon, mille elemendid saadakse "esimene sisse, esimene vĂ€lja" FIFO pĂ”himĂ”ttel.

Okei, jÀtkame.

AsĂŒnkroonne programmeerimine JavaScriptis. (Callback, Promise, RxJs)

JavaScript on ĂŒhesuunaline programmeerimiskeel. See tĂ€hendab, et sellel on ainult ĂŒks tĂ€itmisprotsess ja ĂŒks virn, kuhu funktsioonid jĂ€etakse tĂ€itmiseks ootele. Seega vĂ”ib JavaScript korraga sooritada ainult ĂŒhe operatsiooni, teised operatsioonid ootavad oma jĂ€rjekorda virnas, kuni neid kutsutakse.

Kutsumisvirn — see on andme struktuur, mis lihtsustatult öeldes salvestab teavet programmikohtade kohta, kus me asume. Kui me lĂ€heme funktsiooni, paneme selle kohta kirje virna tippu. Kui me funktsioonist tagasi tuleme, tĂ”mbame virnast vĂ€lja kĂ”ige ĂŒlemise elemendi ja leiame end sealt, kust seda funktsiooni kutsuti. See on kĂ”ik, mida virn oskab. Ja nĂŒĂŒd on vĂ€ga huvitav kĂŒsimus. Kuidas siis toimib asĂŒnkroonsus JavaScriptis?

AsĂŒnkroonne programmeerimine JavaScriptis. (Callback, Promise, RxJs)

Tegelikult on lisaks virnale brauserites eriline jĂ€rjekord, mis tegeleb nii nimetatud WebAPI-ga. Selle jĂ€rjekorra funktsioonid tĂ€idetakse jĂ€rjestikku ainult pĂ€rast seda, kui virn on tĂ€ielikult tĂŒhi. Alles siis paigutatakse need jĂ€rjekorrast virna tĂ€itmiseks. Kui virnas on hetkel vĂ€hemalt ĂŒks element, ei saa nad virna sattuda. Just sellepĂ€rast on ajavahemiku jĂ€rgi kutse sageli ajaliselt ebatĂ€pne, kuna funktsioon ei saa minna jĂ€rjekorrast virna, kuni see on tĂ€is.

Vaatame jĂ€rgmist nĂ€idet ja teeme selle samm-sammult 'tĂ€itmise'. Samuti vaatame, mis sel ajal sĂŒsteemis toimub.

console.log('Hi);
setTimeout(function cb1() {
    console.log('cb1');
}, 5000);
console.log('Bye');

AsĂŒnkroonne programmeerimine JavaScriptis. (Callback, Promise, RxJs)

1) Praegu ei toimu midagi. Brauseri konsool on tĂŒhi, kutse virn on tĂŒhi.

AsĂŒnkroonne programmeerimine JavaScriptis. (Callback, Promise, RxJs)

2) Siis lisatakse kĂ€sk console.log(‘Hi’) kutse virna.

AsĂŒnkroonne programmeerimine JavaScriptis. (Callback, Promise, RxJs)

3) Ja see tÀidetakse.

AsĂŒnkroonne programmeerimine JavaScriptis. (Callback, Promise, RxJs)

4) Siis eemaldatakse console.log(‘Hi’) kutse virnast.

AsĂŒnkroonne programmeerimine JavaScriptis. (Callback, Promise, RxJs)

5) NĂŒĂŒd liigume kĂ€su setTimeout(function cb1() {
 }). juurde. See lisatakse kutse virna.

AsĂŒnkroonne programmeerimine JavaScriptis. (Callback, Promise, RxJs)

6) KÀsk setTimeout(function cb1() {
 }) tÀidetakse. Brauser loob ajastuse, mis on osa Web API-st. See hakkab aega maha arvestama.

AsĂŒnkroonne programmeerimine JavaScriptis. (Callback, Promise, RxJs)

7) KĂ€sk setTimeout(function cb1() {
 }) on lĂ”petanud oma töö ja eemaldatakse kutse virnast.

AsĂŒnkroonne programmeerimine JavaScriptis. (Callback, Promise, RxJs)

8) KĂ€sk console.log(‘Bye’) lisatakse kutse virna.

AsĂŒnkroonne programmeerimine JavaScriptis. (Callback, Promise, RxJs)

9) KĂ€sk console.log(‘Bye’) tĂ€idetakse.

AsĂŒnkroonne programmeerimine JavaScriptis. (Callback, Promise, RxJs)

10) KĂ€sk console.log(‘Bye’) eemaldatakse kutse virnast.

AsĂŒnkroonne programmeerimine JavaScriptis. (Callback, Promise, RxJs)

11) PÀrast seda, kui on möödunud vÀhemalt 5000 ms., lÔpetab ajastamine töö ja paneb tagaside cb1 tagasi tagaside jÀrjekorda.

AsĂŒnkroonne programmeerimine JavaScriptis. (Callback, Promise, RxJs)

12) Ürituste tsĂŒkkel vĂ”tab funktsiooni cb1 tagaside jĂ€rjekorrast ja paneb selle kutse virna.

AsĂŒnkroonne programmeerimine JavaScriptis. (Callback, Promise, RxJs)

13) Funktsioon cb1 tĂ€idetakse ja lisab console.log(‘cb1’) kutse virna.

AsĂŒnkroonne programmeerimine JavaScriptis. (Callback, Promise, RxJs)

14) KĂ€sk console.log(‘cb1’) tĂ€idetakse.

AsĂŒnkroonne programmeerimine JavaScriptis. (Callback, Promise, RxJs)

15) KĂ€sk console.log(‘cb1’) eemaldatakse kutse virnast.

AsĂŒnkroonne programmeerimine JavaScriptis. (Callback, Promise, RxJs)

16) Funktsioon cb1 eemaldatakse kutse virnast.

Vaadakem dĂŒnaamikat nĂ€ite nĂ€itel:

AsĂŒnkroonne programmeerimine JavaScriptis. (Callback, Promise, RxJs)

Nii oleme arutanud, kuidas JavaScriptis asĂŒnkroonsust rakendatakse. NĂŒĂŒd rÀÀgime lĂŒhidalt asĂŒnkroonse koodi arengust.

AsĂŒnkroonse koodi areng.

a(function (resultsFromA) {
    b(resultsFromA, function (resultsFromB) {
        c(resultsFromB, function (resultsFromC) {
            d(resultsFromC, function (resultsFromD) {
                e(resultsFromD, function (resultsFromE) {
                    f(resultsFromE, function (resultsFromF) {
                        console.log(resultsFromF);
                    })
                })
            })
        })
    })
});

AsĂŒnkroonset programmeerimist, nagu me seda JavaScriptis tunneme, saab rakendada ainult funktsioonide kaudu. Neid saab edastada teistele funktsioonidele nagu mistahes teised muutujad. Nii said alguse tagasihelbid. See on lahe, lĂ”bus ja toretsev, kuni see muutub kurvaks ja masendavaks. Miks? KĂ”ik on lihtne:

  • Koodi keerukuse kasvuga muutub projekt kiiresti arusaamatuks sĂŒgavalt pesitsevateks plokkideks — „tagasikutsumise pĂ”rgu“.
  • Vead vĂ”ib kergesti tĂ€helepanuta jĂ€tta.
  • VĂ€ljendeid ei saa returni kaudu tagasi anda.

Promise'i saabumisega muutus olukord veidi paremaks.

uus Promise(function(resolve, reject) {
    setTimeout(() => resolve(1), 2000);

}).then((result) => {
    alert(result);
    return result + 2;

}).then((result) => {
    throw new Error('SIIN EBAUS');
    alert(result);
    return result + 2;

}).then((result) => {
    alert(result);
    return result + 2;

}).catch((e) => {
    console.log('viga: ', e);
});

  • Aktiivne Promise'a ahel tĂ€iendab koodi arusaadavust
  • Sisse tuli eraldi veateate kĂ€sitsemise meetod
  • Ilmus vĂ”imalus paralleelseks tĂ€itmiseks Promise.all abil
  • SĂŒvenenud asĂŒnkroonsust saame lahendada async/await abil

Kuid Promise'il on oma piirangud. NĂ€iteks ei saa seda tantsimata tĂŒhistada ja mis kĂ”ige tĂ€htsam, see töötab ĂŒhe vÀÀrtusega.

NĂŒĂŒd oleme sujuvalt jĂ”udnud reaktiivse programmeerimise juurde. Kas oled vĂ€sinud? Kuid Ă”nneks saad minna teed tegema, mĂ”tle ja naase edasi lugema. Mina jĂ€tkan.

AsĂŒnkroonne programmeerimine JavaScriptis. (Callback, Promise, RxJs)

Reaktiivne programmeerimine — programmimise paradigma, mis on suunatud andmevoogudele ja muudatuste levikule. Vaatame lĂ€hemalt, mis on andmevoog.

// ĐŸĐŸĐ»ŃƒŃ‡Đ°Đ”ĐŒ ссылĐșу ĐœĐ° ŃĐ»Đ”ĐŒĐ”ĐœŃ‚
const input = ducument.querySelector('input');

const eventsArray = [];

// ĐŸŃƒŃˆĐžĐŒ ĐșĐ°Đ¶ĐŽĐŸĐ” ŃĐŸĐ±Ń‹Ń‚ĐžĐ” ĐČ ĐŒĐ°ŃŃĐžĐČ eventsArray
input.addEventListener('keyup',
    event => eventsArray.push(event)
);

Kujutage ette, et meil on sisestusala. Loome massiivi ja iga keyup sĂŒndmuse puhul salvestame sĂŒndmuse meie massiivi. Oluline on mĂ€rkida, et meie massiiv on jĂ€rjestatud aja pĂ”hjal, s.t. hilisemate sĂŒndmuste indeks on suurem kui varasemate indeks. Selline massiiv esindab lihtsustatud andmevoogu, kuid see ei ole veel voog. Selle massiivi rahuldavaks nimetamiseks vooguks peab see suutma mingil viisil teavitada tellijaid, et sellesse on lisandunud uusi andmeid. Nii jĂ”uame voogude mÀÀratlemise juurde.

Andmevoog

const { interval1 } = Rx;
const { take } = RxOperators;

interval(1000).pipe(
    take(4)
)

AsĂŒnkroonne programmeerimine JavaScriptis. (Callback, Promise, RxJs)

Voogon aja jĂ€rgi jĂ€rjestatud andmemassiiv, mis suudab teavitada, et andmed on muutunud. Kujutage nĂŒĂŒd ette, kui mugav on kirjutada koodi, kus ĂŒhe tegevuse jaoks tuleb kutsuda mitmeid sĂŒndmusi erinevates koodilĂ”ikudes. Lihtsalt tellime voogu ja see teavitab meid iseseisvalt, kui muudatused toimuvad. Seda oskab teha RxJs raamatukogu.

AsĂŒnkroonne programmeerimine JavaScriptis. (Callback, Promise, RxJs)

RxJS — on asĂŒnkroonsete ja sĂŒndmustel pĂ”hinevate programmide töötamiseks mĂ”eldud teek, mis kasutab jĂ€lgitavaid jĂ€rjestusi. Teek pakub pĂ”hiliiki Observable, mitu abiliiki (Observer, Schedulers, Subjects) ja sĂŒndmustega töötamise operaatorid, nagu kollektsioonid (map, filter, reduce, every ja sarnased JavaScripti massiivist).

Vaatame selle teegi pÔhikontseptsioone.

Observable, Observer, Producer

Observable — esimene pĂ”hitĂŒĂŒp, mida kĂ€sitleme. See klass sisaldab RxJs-i peamist rakenduse osa. See on seotud jĂ€lgitava vooga, millele saab tellida, kasutades meetodit subscribe.

Observable-is on rakendatud abimehhanism vĂ€rskenduste loomiseks, mida nimetatakse Observer. VÀÀrsuse allikaks Observerile on Producer. See vĂ”ib olla massiiv, iterator, veebiteenus, mĂ”ni sĂŒndmus jne. Seega vĂ”ib öelda, et observable toimib juhina Produceri ja Observeri vahel.

Observable töötleb kolme tĂŒĂŒpi sĂŒndmusi Observeri jaoks:

  • next – uued andmed
  • error – viga, kui jĂ€rjestus lĂ”petatakse erandliku olukorra tĂ”ttu. See sĂŒndmus tĂ€hendab samuti jĂ€rjestuse lĂ”petamist.
  • complete — seeria lĂ”petamise signaal. See tĂ€hendab, et uusi andmeid enam ei tule.

Vaata demot:

AsĂŒnkroonne programmeerimine JavaScriptis. (Callback, Promise, RxJs)

Alguses töötleme vÀÀrtusi 1, 2, 3, ja pÀrast 1 sekundi möödumist saame 4 ning lÔpetame meie voogu.

MÔtted valjult

Ja siis mĂ”istsin, et rÀÀkida oli huvitavam kui kirjutada sellest. 😀

Tellimus

Kui me teeme tellimuse voole, loome uue klassi subscription, mis annab meile vĂ”imaluse tellimus lĂ”petada meetodi kaudu unsubscribe. Samuti saame tellimusi gruppidesse panna meetodi abil add. Loomulikult saame vooge eemaldada meetodi kaudu remove. Meetodid add ja remove vĂ”tavad sisendiks teise tellimuse. Tahan mĂ€rkida, et kui me tĂŒhistame tellimuse, tĂŒhistame kĂ”ik lapse tellimused nagu oleksime neis meetodi unsubscribe kutsunud. JĂ€tkame.

Vood tĂŒĂŒbid

HOTCOLD
Produtsent luuakse observable'i vÀljastpooltProdutsent luuakse observable'i sees
Andmed edastatakse observable'i loomise hetkelAndmed teatatakse tellimise hetkel
Vajalik on lisaloogika tellimuse tĂŒhistamiseksVoog lĂ”peb iseseisvalt
Kasutab ĂŒks-mitmele seostKasutab ĂŒks-ĂŒhele seost
KĂ”ik tellimused omavad ĂŒhte vÀÀrtustTellimused on sĂ”ltumatud
Andmed vÔivad kaduda, kui tellimust poleTaaskavandab kÔik voolu vÀÀrtused uue tellimuse jaoks

Kui tuua analoogia, siis kujutaksin kuuma voogu nagu filmi kinosaalis. Mis iganes ajahetkel sa sisse astud, sellest hetkest alates hakkad vaatama. KĂŒlma voogu vĂ”rdleksin helistamisega tehnilisse tugi. Iga helistaja kuuleb salvestust algusest lĂ”puni, kuid saad lopendada kĂ”ne unsubscribe abil.

Tahaksin mĂ€rkida, et eksisteerivad ka nn soojad vood (sellist mÀÀratlust olen kohanud ÀÀrmiselt harva ja vaid vĂ€lismaistes kogukondades) — see on voog, mis muundatakse kĂŒlmast voost kuumaks. Kuidas seda kasutada? Toona toon nĂ€ite praktikas.

Ma töötan Angulariga. See kasutab aktiivselt RxJS'i. Andmete saamiseks serverist ootan kĂŒlma voogu ja kasutan seda ĆĄabloonis asyncPipe'i abil. Kui kasutan seda pipe'i mitu korda, siis, naastes kĂŒlma voo mÀÀratlemise juurde, kĂŒsib iga pipe andmeid serverist, mis on pehmelt öeldes kummaline. Kui aga muudan kĂŒlma voo soojaks, toimub pĂ€ring vaid korra.

Tegelikult on voogude tĂŒĂŒpide mĂ”istmine algajatele ĂŒsna keeruline, kuid oluline.

Operaatoreid

return this.http.get(`${environment.apiUrl}/${this.apiUrl}/trade_companies`)
    .pipe(
        tap(({ data }: TradeCompanyList) => this.companies$$.next(cloneDeep(data))),
        map(({ data }: TradeCompanyList) => data)
    );

Asetuse töötlemiseks voogudega vĂ”imaldab meile operaatorite kasutamine. Need aitavad juhtida sĂŒndmusi, mis voolavad Observable'is. Tutvume mĂ”ne populaarse operaatoriga, detailsemalt operaatorite kohta on teavet kasulikku informatsiooni linkides.

Operaatorid — of

Alustame abistava operaatoriga of. See loob Observable'i lihtsast vÀÀrtusest.

AsĂŒnkroonne programmeerimine JavaScriptis. (Callback, Promise, RxJs)

Operaatorid — filter

AsĂŒnkroonne programmeerimine JavaScriptis. (Callback, Promise, RxJs)

Filter operaator filter, nagu nimest jÀreldada, filtreerib voolu signaali. Kui operaator tagastab tÔe, siis lubab edasised signaalid lÀbi.

Operaatorid — take

AsĂŒnkroonne programmeerimine JavaScriptis. (Callback, Promise, RxJs)

take — VĂ”tab arvesse emissioonide arvu, pĂ€rast mida voog lĂ”ppeb.

Operaatorid — debounceTime

AsĂŒnkroonne programmeerimine JavaScriptis. (Callback, Promise, RxJs)

debounceTime — filtreerib vĂ€lja emissioonid, mis esinevad mÀÀratud ajavahemikus, emitades viimase vÀÀrtuse pĂ€rast ajavahemiku lĂ”ppu.

const { Observable } = Rx;
const { debounceTime, take } = RxOperators;

Observable.create((observer) => {
  let i = 1;
  observer.next(i++);
  // Emiteerib vÀÀrtuse iga 1000ms jÀrel
  setInterval(() => {
    observer.next(i++)
  }, 1000);

 // Emiteerib vÀÀrtuse iga 1500ms jÀrel
  setInterval(() => {
    observer.next(i++)
  }, 1500);
}).pipe(
  debounceTime(700),  // Ootame 700ms, enne kui töötleme vÀÀrtuseid
  take(3)
);  

AsĂŒnkroonne programmeerimine JavaScriptis. (Callback, Promise, RxJs)

Operaatorid — takeWhile

AsĂŒnkroonne programmeerimine JavaScriptis. (Callback, Promise, RxJs)

Emitab vÀÀrtusi seni, kuni takeWhile ei tagasta false, pÀrast mida lÔpetab voost.

const { Observable } = Rx;
const { debounceTime, takeWhile } = RxOperators;

Observable.create((observer) => {
  let i = 1;
  observer.next(i++);
  // Emiteerib vÀÀrtuse iga 1000ms jÀrel
  setInterval(() => {
    observer.next(i++)
  }, 1000);
}).pipe(
  takeWhile(producer => producer < 5)
);  

AsĂŒnkroonne programmeerimine JavaScriptis. (Callback, Promise, RxJs)

Operaatorid — combineLatest

Kombineeritud operaator combineLatest on sarnane promise.all-iga. See ĂŒhendab mitu voogu ĂŒheks. Kui iga voog on vĂ€hemalt korra vÀÀrtuse edastanud, saame viimased vÀÀrtused igast voost massiivina. Edasi, peale igat vÀÀrtuse edastamist ĂŒhendatud voogudest, hakkab see andma uusi vÀÀrtusi.

AsĂŒnkroonne programmeerimine JavaScriptis. (Callback, Promise, RxJs)

const { combineLatest, Observable } = Rx;
const { take } = RxOperators;

const observer_1 = Observable.create((observer) => {
  let i = 1;
  // Edastame vÀÀrtuse iga 1000 ms jÀrel
  setInterval(() => {
    observer.next('a: ' + i++);
  }, 1000);
});

const observer_2 = Observable.create((observer) => {
  let i = 1;
  // Edastame vÀÀrtuse iga 750 ms jÀrel
  setInterval(() => {
    observer.next('b: ' + i++);
  }, 750);
});

combineLatest(observer_1, observer_2).pipe(take(5));

AsĂŒnkroonne programmeerimine JavaScriptis. (Callback, Promise, RxJs)

Operaatorid — zip

Zip — ootab vÀÀrtust igast voost ja loob massiivi nende vÀÀrtuste pĂ”hjal. Kui vÀÀrtus ei saabu mĂ”nest voost, siis gruppi ei moodustata.

AsĂŒnkroonne programmeerimine JavaScriptis. (Callback, Promise, RxJs)

const { zip, Observable } = Rx;
const { take } = RxOperators;

const observer_1 = Observable.create((observer) => {
  let i = 1;
  // Emit value every 1000ms
  setInterval(() => {
    observer.next('a: ' + i++);
  }, 1000);
});

const observer_2 = Observable.create((observer) => {
  let i = 1;
  // Emit value every 750
  setInterval(() => {
    observer.next('b: ' + i++);
  }, 750);
});

const observer_3 = Observable.create((observer) => {
  let i = 1;
  // Emit value every 500
  setInterval(() => {
    observer.next('c: ' + i++);
  }, 500);
});

zip(observer_1, observer_2, observer_3).pipe(take(5));

AsĂŒnkroonne programmeerimine JavaScriptis. (Callback, Promise, RxJs)

Operators — forkJoin

forkJoin ĂŒhendab vooge, kuid emiteerib vÀÀrtuse ainult siis, kui kĂ”ik vood on lĂ”petatud (complete).

AsĂŒnkroonne programmeerimine JavaScriptis. (Callback, Promise, RxJs)

const { forkJoin, Observable } = Rx;
const { take } = RxOperators;

const observer_1 = Observable.create((observer) => {
  let i = 1;
  // Emiteerime vÀÀrtuse iga 1000ms
  setInterval(() => {
    observer.next('a: ' + i++);
  }, 1000);
}).pipe(take(3));

const observer_2 = Observable.create((observer) => {
  let i = 1;
  // Emiteerime vÀÀrtuse iga 750
  setInterval(() => {
    observer.next('b: ' + i++);
  }, 750);
}).pipe(take(5));

const observer_3 = Observable.create((observer) => {
  let i = 1;
  // Emiteerime vÀÀrtuse iga 500
  setInterval(() => {
    observer.next('c: ' + i++);
  }, 500);
}).pipe(take(4));

forkJoin(observer_1, observer_2, observer_3);

AsĂŒnkroonne programmeerimine JavaScriptis. (Callback, Promise, RxJs)

Operators — map

Transformatsiooni operaator map muundab emiteeritava vÀÀrtuse uueks.

AsĂŒnkroonne programmeerimine JavaScriptis. (Callback, Promise, RxJs)

const { Observable } = Rx;
const { take, map } = RxOperators;

Observable.create((observer) => {
  let i = 1;
  // VÀljastame vÀÀrtuse iga 1000 ms tagant
  setInterval(() => {
    observer.next(i++);
  }, 1000);
}).pipe(
  map(x => x * 10),
  take(3)
);

AsĂŒnkroonne programmeerimine JavaScriptis. (Callback, Promise, RxJs)

Operaatoreid – share, tap

Tap operaator vĂ”imaldab teostada kĂŒlgtoimeid, st mingeid tegevusi, mis ei mĂ”juta jĂ€rjestust.

Utilitaarne operaator share suudab kĂŒlmast voogust teha sooja voolu.

AsĂŒnkroonne programmeerimine JavaScriptis. (Callback, Promise, RxJs)

Ooperaatoreid on piisavalt. Liigume Subjecti juurde.

MÔtted valjult

Ja siis lĂ€ksin teed joogile. Need nĂ€ited vĂ€sitavad mind 😀

Subjectite perekond

Subjectite perekond on selge nĂ€ide sooja voolu. Need klassid on omamoodi hĂŒbriid, mis toimivad samaaegselt nii observable’ina kui observer’ina. Kuna subject on soe vool, tuleb sellest Ă€ra tellida. Peamiste meetodite hulka kuuluvad:

  • next – edastamine uusi andmeid voolu
  • error – viga ja voolu lĂ”petamine
  • complete – voolu lĂ”petamine
  • subscribe – voolule tellimine
  • unsubscribe – voolust loobumine
  • asObservable – transformeerime observer’iks
  • toPromise – transformeerib promiseks

Erinevate subjectite tĂŒĂŒpe on 4-5.

MÔtted valjult

Stream’is rÀÀkisin 4-st, aga selgus, et nad on veel ĂŒhe lisanud. Nagu öeldakse, elad ja Ă”pid.

Lihtne Subject new Subject()– ainus lihtsaim subject-tĂŒĂŒp. Luua saab ilma parameetriteta. Edastab vÀÀrtusi, mis saabuvad ainult pĂ€rast tellimist.

BehaviorSubject new BehaviorSubject(defaultData) – minu arvates kĂ”ige levinum subject-tĂŒĂŒp. VĂ”tab sisendina vastu vaikimisi vÀÀrtuse. Salvestab alati viimase emit'i andmed, mida ta edastab tellimise ajal. Sellel klassil on ka kasulik meetod value, mis tagastab voogude praeguse vÀÀrtuse.

ReplaySubject new ReplaySubject(bufferSize?: number, windowTime?: number) — VĂ”ib esimesena argumentina valida optimaalselt vÀÀrtuste puhversuuruse, mida ta endas salvestab, ja teiseks aja, mille jooksul me muudatusi vajame.

AsyncSubject new AsyncSubject() — Tellimise ajal ei juhtu midagi ning vÀÀrtus tagastatakse alles siis, kui see on complete. Tagastatakse ainult voogude viimane vÀÀrtus.

WebSocketSubject new WebSocketSubject(urlConfigOrSource: string | WebSocketSubjectConfig | Observable, destination?: Observer) — Selle kohta ei rÀÀgi dokumentatsioon ning nĂ€en seda esmakordselt. Kes teab, mida see teeb, kirjutage, tĂ€iustame.

Uhh. NĂŒĂŒd oleme kĂ€sitlenud kĂ”ike, mida tahtsin tĂ€na rÀÀkida. Loodan, et see teave oli kasulik. Iseseisvalt saab kirjanduse nimekirjaga tutvuda kasuliku teabe vahekaardil.

Kasulik teave

Allikas: habr.com

Osta usaldusvÀÀrne veebihosting DDoS kaitsega, VPS VDS serverid đŸ”„ Osta usaldusvÀÀrne veebihosting DDoS kaitsega, VPS VDS serverid | ProHoster