Saturday 23 September 2017

Rx Liikkuvan Keskiarvon


Rahoitusalalla meidän on tavallisesti laskettava liikkuva ikkunan aggregaattiarvo aikasarjan datavirrasta, käytä esimerkkinä liikkuvaa keskiarvoa, sanoa, että meillä on seuraava tietovirta T on aikaleima ja V on todellinen vlaue. to laskea liikkuva keskiarvo 3 siitä virtauksesta, jonka saamme. Liikkuvan keskiarvon laskemiseksi tuntuu siltä, ​​että voisimme tehdä sen by. buildin avulla Observable alkuperäisestä stream. buildista Observable alkuperäisestä streamista aggregoimalla arvot ryhmiksi. using aggregate operator laskea lopulliset tulokset Observable vaiheessa 2. Seurannat 1 ja 3 ovat triviaaleja toteuttaa kuitenkin vaiheessa 2 näyttää siltä, ​​että nykyinen RxJava ei ole sisäänrakennettu operaattori tuottaa liikkuvia ikkunoita ryhmiä, ikkunaryhmänBy operaattori ei näytä sopii tähän tapaukseen, enkä löytänyt helppoa ratkaisua olemassa olevista toimijoista, voiko joku ehdottaa, miten tämä tehdään RxJavassa tyylikkäästi. asked 28.12. klo 6 29. I d näin näin Käytän ikkunaa, joka lähettää Observables, joka onl y käytä vakiomäärää muistia eikä puskuria, joka lähettää luettelot, jotka kuluttavat muistia jokaiselle tuotteelleen. Tämä on esimerkki siitä, miten voit käyttää combinator-operaattoreita omien silmukoiden kirjoittamisen sijaan, mitä sinun tulisi aina harkita käytettäessä Observables. Update Jos haluat suodattaa ikkunat, joiden lopussa on vähemmän kuin n elementit, voit tehdä sen näin. Valitsin Scalan, koska se on lyhyempi, mutta Java: ssa voit tehdä samoin, huomaa vain, että Scala s foldLeft kutsutaan vähennettäväksi Java: ssa. Vastattu 4.1.14 klo 22 20. Practical Rx Training Lontoossa 6-7.10.2015. Tekijä on esittänyt. PART 1 - Getting started. Users odottaa reaaliaikaista dataa He haluavat tweets nyt Heidän tilauksensa vahvisti nyt He tarvitsevat hintoja tarkkoja nyt Heidän online-pelien on oltava herkkiä Kehittäjänä pyydät palo-ja - unohda viestit Haluat olla estetty odottamassa tulosta Haluat saada tuloksen työntää sinut, kun se on valmis Jopa paremmin, kun työskentelet tulossarjoilla, haluat vastaanottaa yksittäisiä tuloksia, kun ne ovat valmiita Et halua odota koko sarjan käsittelyä ennen kuin näet ensimmäisen rivin Maailma on siirtynyt työntääkseen käyttäjät odottavat meitä kiinni Kehittäjät ovat työkaluja tietojen lähettämiseen, tämä on helppoa Kehittäjät tarvitsevat työkaluja reagoimaan tietojen siirtämiseen. Ideasiat Reactive Laajennukset Rx: lle Tämä kirja on tarkoitettu kehittymään r utelias IObservable T ja IObserver T - liitännät, jotka ovat tulleet esiin 4 Microsoftin Reactive Extensions - kirjastot ovat näiden rajapintojen toteutuksia, jotka nopeuttavat nopeasti vetovoimaa Server-, Client - ja Web-kehittäjien kanssa Rx on tehokas tuottava kehitystyökalu Rx mahdollistaa kehittäjien ongelmien ratkaisemisen tyylikkäässä, tuttu ja julistetussa tyylissä usein ratkaisevasti pienemmällä koodilla kuin mahdollista ilman Rx: ää LINQ: n hyödyntämisellä Rx ylpeilee LINQ-toteutuksen tavanomaisista eduista 1. Integroitu LINQ on integroitu C-kieleen LINQ: n avulla voit hyödyntää nykyisiä taitoja lepopisteiden kyselyssä LINQ SQL: lle, LINQ: lle XML: lle tai LINQ: lle kohteille, jotka pyytävät tietoja liikkeessä Voit ajatella Rx: tä LINQ: ksi tapahtumiin LINQ: n avulla voit siirtyä muista paradigmista yhteiseksi paradigmaksi Voit esimerkiksi siirtää tavallisen tapahtuman, asynkronisen menetelmän puhelun, tehtävän tai kolmannen osapuolen middleware-sovellusliittymän yhdeksi mmon Rx paradigma Käyttämällä nykyistä kieltäsi ja käyttämällä tuttuja operaattoreita, kuten Select Where GroupBy jne., kehittäjät voivat järkeistää ja kommunikoida malleja tai koodia yhteiseen muotoon Extensible Voit laajentaa Rx: n omilla mukautetuilla kyselyn operaattoreilla laajennusmenetelmillä Declarative LINQ sallii koodisi lukea ilmaisuksi siitä, mitä koodisi tekee ja jättää operaattorin käyttöönoton. Sekoittuvat LINQ-ominaisuudet, kuten laajennusmenetelmät, lambda-syntaksit ja kyselyn ymmärtämissyntaksit, antavat kehittäjille sujuvan sovelluksen. Kyselyjä voidaan rakentaa lukuisilla operaattorit Kyselyt voidaan sitten koota yhdessä tuottamaan komposiittikyselyjä Transformatiiviset kyselyt voivat muuntaa tietonsa yhdestä tyypistä toiseen Kysely voi muuntaa yhden arvon toiseen arvoon, joka voidaan yhdistää arvojärjestyksestä yhteen keskiarvoon tai laajentaa yksittäisiä tietoja arvo arvoksi. Kun Rx sopii, Rx tarjoaa luonnollisen paradigman jotka käsittelevät tapahtumasekvenssejä Sekvenssi voi sisältää nollaa tai useampia tapahtumia Rx osoittautuu arvokkaimmaksi kirjoitettaessa tapahtumasarjoja. Käytä Rx. Managing - tapahtumia, kuten nämä, on se, mitä Rx on rakennettu. UI-tapahtumia, kuten hiiren siirto, painikkeen napsautus. tapahtumia, kuten omaisuus muuttunut, kokoelma päivittynyt, tilaus täytetty, rekisteröinti hyväksytty jne. Infrastruktuuri tapahtumia, kuten tiedostojen tarkkailija, järjestelmä ja WMI tapahtumia. Integraatio tapahtumia, kuten lähetys viestibussi tai push tapahtuma WebSockets API tai muu alhainen latenssi middleware kuten Nirvana. Integraatio CEP-moottorin kanssa, kuten StreamInsight tai StreamBase. Kiinnostava Microsoftin CEP-tuote StreamInsight, joka on osa SQL Server - perheä, käyttää myös LINQ: tä kyselyjen luomiseen datatietotapahtumien yli. Rx sopii hyvin myös samanaikaisen purkamisen tarkoitus Toisin sanoen tietyn työryhmän suorittaminen samanaikaisesti vapauttaa nykyinen säie Erittäin suosittu käyttö on vastuu ve UI. Sinun tulisi harkita Rx: n käyttämistä, jos sinulla on olemassa oleva IEnumerable T, joka yrittää mallintaa tietoja liikkeessä Vaikka IEnumerable T voi mallintaa liikkeessä olevia tietoja käyttäen laiska-arviointia, kuten tuoton tuottoa, se todennäköisesti voitti t-asteikon IE: numeroitavan T: n sinun kannattaa joko estää Rx: n ei-estävää luonnetta joko IObservable T: n kautta tai harkita async-ominaisuuksia 4: ssä 5. Käytä Rx. Rx: tä voidaan käyttää myös asynkronisissa puheluissa. Nämä ovat tehokkaasti yhden tapahtuman sekvenssit. Tehtävä tai tehtävä T. APM - menetelmän kutsu kuten FileStream BeginRead EndRead. Vaihda käyttää TPL, Dataflow tai async-avainsanaa 4 5 osoittautuu luonnollisemmaksi tapa muodostaa asynkronisia menetelmiä Vaikka Rx voi ehdottomasti auttaa näitä skenaarioita, jos käytössäsi on muita tarkoituksenmukaisempia puitteita, sinun on ensin harkittava niitä. Rx voidaan käyttää, mutta se on vähemmän sovitettavissa yhdensuuntaisuuden käyttöönottoon ja hallintaan skaalautumisen tai rinnakkaisen utput Muut erilliset kehykset kuten TPL Tehtävä rinnakkaiskirjasto tai C AMP ovat sopivia suorittamaan rinnakkaisen laskenta intensiivisen työn. Rx ja erityisesti IObservable T ei ole korvaava IENumerable TI ei suosittele yrittää ottaa jotain, joka on luonnollisesti vedä perustuu ja pakottaa sen olla push based. Translating nykyisiä IEnumerable T-arvot IObervable T vain niin, että koodijoukko voi olla enemmän Rx. Message jonot Queues kuten MSMQ tai JMS täytäntöönpano on yleensä transaktio-ja ovat määritelmän mukaisesti peräkkäin tunnen IEnumerable T on luonnollinen sovitus täältä. Valitsemalla parhaan työkalun työsi koodisi pitäisi olla helpompi ylläpitää, tarjota parempaa suorituskykyä ja luultavasti saada parempaa tukea. Rx toiminnassa. Hyväksyminen ja oppiminen Rx voi olla iteratiivinen lähestymistapa, jossa voit hitaasti soveltaa sitä infrastruktuuri ja verkkotunnus Lyhyessä ajassa sinulla pitäisi olla kyky tuottaa koodia tai vähentää olemassa olevaa koodia yksinkertaisiin op erators Esimerkiksi tämä yksinkertainen ViewModel on kaikki mitä tarvitsin koodia integroida haku, joka on tarkoitus suorittaa käyttäjän tyypit. Julkinen luokka MemberSearchViewModel INotifyPropertyChanged. Vaikka tämä koodinpätkä on melko pieni se tukee seuraavia vaatimuksia. Sisältää reagoivan UI. Supports timeouts. Knows, kun haku on valmis. Onko tuloksia tulla takaisin yksi kerrallaan. Handles virheitä. On yksikkö testata, vaikka rinnakkaisongelmat. Jos käyttäjä muuttaa hakua, peruuta nykyinen haku ja suorittaa uusi haku uudella tekstillä. Tämän näytteen tuottaminen on lähes tapaus, jossa vaatimusten täyttävät operaattorit kootaan yhdeksi kyselyksi. Kysely on pieni, ylläpidettävää, selittävä ja paljon vähemmän koodaa kuin omalla tavallaan. On lisäetuna uudestaan ​​käytetyn API: n uudelleenkäytöstä. sinun on kirjoitettava, sitä vähemmän koodia sinun on testattava, debugoitava ja ylläpidettävä Muiden kyselyjen luominen, kuten seuraavaksi, on yksinkertainen. laskemalla joukon arvoja, esim. el keskimääräisiä viivästymisiä tai seisokkeja koskevia tapahtumatietoja useista lähteistä, esim. Bingin, Googlen ja Yahoo: n hakutulokset tai kiihtyvyysanturista, gyroista, magnetometristä tai lämpötiloista saadut tiedot. esim. tweets aiheittain tai käyttäjillä tai osakekurssit delta - tai likviditeetin mukaan. suodatusdataa, esim. verkkopelipalvelimet alueella, tietyn pelin tai osanottajien vähimmäismäärän kanssa. Push on täällä Rx: n asentaminen on tehokas tapa vastata käyttäjien odotuksiin push-maailmassa Ymmärtämällä ja kirjoittamalla osa-alueet Rx pystyt tekemään lyhyitä tehtäviä tulevien tapahtumien käsittelyn monimutkaisuudesta Rx on asetettu tulemaan päivittäiseksi osa koodekokokemustasi. Lisä suositeltu lukeminen. Lee Campbell Johdatus Rx Kindle - versioon 2012. Sovitun yhtälöt. Jokainen tämän kirjan osasta on nyt käsitelty melko itsenäinen käsite Avain tyypit, elinikäinen hallinta, anamorfismi, katamorfismi, sitominen, virtauksen säätö, ajoitus ja testaus I n aiemmissa luvuissa olemme tarkastelleet useiden sekvenssien yhdistämistä operaattoreiden kuten SelectMany Merge Zip Concatin jne. kanssa. Nämä operaattorit ovat hieman yksinkertaisempia kuin tämän luvun toimijat. Tämä viimeinen luku näyttää yhdistelemästä monia näistä aiheista, jotta voimme käsitellä samanaikaisia ​​sekvenssejä, tai sekvenssit sattuma. Voimme suunnitella tapahtumia, joiden kesto on windows Esimerkkejä palvelimesta ylös, henkilö on huoneessa, painike painetaan ja sitä ei ole vielä vapautettu Näitä voidaan muotoilla uudelleen tässä ajassa, palvelin oli ylöspäin Kun ikkunat ovat päällekkäin, sanotaan, että ne ovat samassa ajassa. Buffer-lehtiä. Buffer ei ole uusi operaattori meille, mutta se voidaan nyt käsitteellisesti ryhmitellä ikkunan toimijoiden kanssa. Nämä operaattorit tekevät jotain järjestyksessä ja ikkunana ajan kuluttua Jokainen operaattori avaa ikkunan, kun lähdekoodi tuottaa arvon. Tapa, jolla ikkuna suljetaan ja mitkä arvot ovat alttiina, on tärkein ero kunkin operaattorin välillä. me vain nopeasti kerätä vanhan ystäväpuskurin sisäinen toiminta ja katsoa, ​​miten tämä kartoittaa ajan ikkunoiden käsitteeseen. Buffer luo ikkunan, kun ensimmäinen arvo tuotetaan Sitten tuo arvo sisään sisäiseen välimuistiin Ikkuna pysyy avautuu, kunnes arvojen laskenta on saavutettu Jokainen näistä arvoista on välimuistissa Nyt kun laskenta on saavutettu, ikkuna sulkeutuu ja välimuisti on OnNext ed IList T Kun seuraava arvo tuotetaan lähteestä, välimuisti tyhjennetään ja aloitamme uudelleen Tämä tarkoittaa, että puskuri ottaa IO: n havaitun T: n ja palauttaa IObservable IList T. Example Bufferin määrän 3: ssä. Tässä marmorikaaviossa olen esittänyt palautettavien arvojen luettelon ajankohtana sarakkeessa tietoja, eli arvot 0, 1 2 ovat kaikki palautettu ensimmäisessä puskurissa. Understanding tämä ei ole paljon hyppy ymmärtää puskurin aikaa Laskemisen sijaan kuljemme TimeSpan ikkunan sulkeminen ja siksi puskuri s välimuisti on nyt saneltavissa ajalla sen sijaan, että lasketaan tuotettujen arvojen Tämä on aina niin monimutkaisempaa, koska olemme nyt ottaneet käyttöön jonkinlaisen aikataulun Tuottaa IList T oikeaan ajankohtaan tarvitsemme ajastimen, joka on määritetty suorittamaan ajoitus Tämä tekee myös testata tätä tavaraa paljon helpommin. Esimerkki puskurista, jonka aika on 5 yksikköä. Esimerkki uudelleentarkastetusta. Tarkkaileva TSource Näyte tämä IObservable TSource, IObervable TTick. Window operaattorit ovat hyvin samankaltaisia ​​kuin puskurin operaattorit, ne vain todella eroavat niiden paluuta tyyppi Jos puskuri ottaisi IO-huomisen T: n ja palaisi IObervable IList T: n, ikkuna-operaattorit palauttavat IObservable IObservable T: n. On myös syytä huomata, että puskurin operaattorit eivät tuota puskureitaan, kunnes ikkuna sulkeutuu. Tässä näemme yksinkertaisen ylikuormituksen ikkunaan siellä on yllättävä syketria Window and Buffer overloads. public staattinen IObservable IObservable TSource Window TSource tämä IObservable TSource lähde, int count. public staattinen IObservable IObservable TSource ikkuna TSource tämä IObservable TSource lähde, int count, int skip. julkinen staattinen IObservable IObservable TSource Window TSource tämä IObservable TSource lähde, TimeSpan timeSpan. public staattinen IObservable IObservable TSource ikkuna TSource tämä IObservable TSource lähde, TimeSpan timeSpan, int count. julkinen staattinen IObservable IObservable TSource Window TSorra tämä IObservable TSource lähde, TimeSpan timeSpan, TimeSpan timeShift. public staattinen IObservable IObservable TSource ikkuna TSource tämä IObservable TSource lähde, TimeSpan timeSpan, IScheduler scheduler. public staattinen IObservable IObservable TSource ikkuna TSource tämä IObservable TSource lähde, TimeSpan timeSpan , TimeSpan timeShift, IScheduler scheduler. public staattinen IObservable IObservable TSource Window TSorin tämä IObservable TSource lähde, TimeSpan timeSpan, int laskea, IScheduler scheduler. Esimerkki ikkuna, jonka määrä on 3.Esimerkki ikkuna aikaa 5 yksikköä. Tärkein differenc Näemme tässä, että ikkunaoperaattorit voivat ilmoittaa arvot lähteestä heti, kun ne on tuotettu. Buffer-operaattoreiden on odotettava, kunnes ikkuna sulkeutuu ennen kuin arvot voidaan ilmoittaa koko luetteloksi. Window-toiminnon käynnistäminen. Mielestäni on syytä huomata, ainakin akateemisesta pisteestä, että ikkunaoperaattorit tuottavat IObservable IObservable T Olemme tutkineet sisäkkäisten havaittavissa olevien käsitteiden käsitettä Aggregation Concat Merge ja Switch - kohdassa olevasta aiemmasta luvusta, joilla kaikilla on ylikuormitus, joka ottaa IObservable IObservable T: n ja palauttaa IO huomaavainen T Koska ikkuna-operaattorit varmistavat, että ikkunoiden lapsisekvenssit eivät ole päällekkäin, voimme käyttää kumpaakaan Concat Switch tai Merge-operaattoreista ikkunaryhmän kääntämisen takaisin alkuperäiseen järjestykseensä. on sama kuin. var switchedWindow Observable TimeSpan. WindowWithTime TimeSpan. Customizing Windows. Yleistä ylikuormitukset tarjoavat yksinkertaisia ​​tapoja murtaa sekvenssi pienemmille sisäkkäisille ikkunoille laskemalla ja tai ajan kuluttua Nyt tarkastelemme ylikuormituksia, jotka tarjoavat sinulle lisää joustavuutta Windowsin hallintaa. Hankkii jokaisen elementin havaittavasta sekvenssistä peräkkäisiin päällekkäisiksi ikkunoiksi. windowClosingSelector Toiminto, jota kutsutaan rajausten määrittämiseksi tuotettujen ikkunoiden uusi ikkuna käynnistyy, kun edellinen on suljettu. julkinen staattinen IObservable IObservable TSource Window TSource, TWindowKatso tämä IObservable TSource lähde, Func IObservable TWindowClosing windowClosingSelector. The ensimmäinen näistä monimutkaisia ​​ylikuormia sallii meidät hallitsemaan, kun ikkunat sulkeutuvat WindowClosingSelector-toiminto kutsutaan joka kerta, kun ikkuna luodaan Windows luodaan tilauksen yhteydessä ja heti ikkunan sulkemisen jälkeen Windows sulkeutuu, kun ikkunoiden sekvenssiClosingSelector tuottaa arvon Arvoa ei oteta huomioon, joten ei ole väliä, mitä tyypin sekvenssiarvot ovat Itse asiassa voit jopa vain täydentää järjestystä windowClosingSelector sulkeaksesi ikkunan. Tässä esimerkissä luodaan ikkuna ikkunan sulkemisvalitsimella Palaamme saman kohteen valitsimesta joka kerta ja ilmoitamme asiasta kun käyttäjä painaa enter konsolista. var windo wIdx 0.var-lähde Objektiivinen TimeSpan. var lähempänä uutta aiheyksikköä. closer. The ikkunoiden monimutkainen ylikuormitus mahdollistaa mahdollisesti päällekkäisten ikkunoiden luomisen. Hankkii jokaisen havaittavan sekvenssin elementin nollaksi tai useammaksi ikkunoiksi. windowOpenings Observable sequence, jonka elementit merkitsevät uusien ikkunoiden luomista. windowClosingSelector Toiminto, jota kutsutaan määrittämään kunkin tuotetun ikkunan sulkeminen. Julkinen staattinen IObservable IObservable TSource Window TSource, TWindowOpening, TWindowTämä IObservable TSource lähde, IObervable TWindowOpening windowOpenings, Func TWindowOpening, IObervable TWindowClosing windowClosingSelector. This ylikuormitus vie 3 argumentteja. Järjestelmä, joka kertoo uuden ikkunan avaamisen. Useen ikkunan avautumisarvoa vastaava funktio ja palauttaa ikkunan sulkeutumisjärjestyksen. Tämä ylikuormitus tarjoaa suuren joustavuuden ikkunan avaamisen ja sulkemisen kannalta Windows voivat olla pitkälti riippumattomia toisistaan voivat olla päällekkäin, vaihtelevat kooltaan ja jopa ohittavat arvot lähteestä. Jotta voimme helpottaa tätä monimutkaisempaa ylikuormitusta, yritetään ensin yrittää käyttää sitä yksinkertaisemman Windowin version luomiseksi ylikuormituksen, joka ottaa laskun. Tämän luomiseksi tarvitsemme avaamaan ikkunan aloitusliittymälle ja joka kerta, kun lähde on tuottanut, määritetty määrä T sen ikkuna täytyy sulkea joka kerta, kun lähde tuottaa määritetyn laskutoimituksen. Tähän tarvitaan vain lähdekoodi. Jaamme sen julkaisumenetelmällä ja toimitamme sitten lähdekoodin näkymät jokaisesta argumentista. public static IObservable IObservable T MyWindow T tämä IObervable T lähde, int count. var windowEdge shared. It voi myös olla mielenkiintoista pohtia, miten voit toteuttaa muita ajansiirtomenetelmiä, kuten näytteen tai kaasuläppä ikkunan kanssa. Liity operaattorilla voit loogisesti yhdistää kaksi jaksoa, joissa Zip-operaattori liittää kaksi seqences yhteen indeksin mukaan, Join-operaattorin avulla voit liittää sekvenssejä leikkaamalla ikkunoita Kuten viimeinen ikkuna ylikuormitus juuri katseli, voit määrittää, kun ikkuna sulkeutuu toiminto, joka ottaa avausarvoa ja palauttaa havaittavissa oleva sekvenssi ilmaista kun ikkunan on suljettava Liityntäkäyttäjällä on kaksi tällaista toimintoa, yksi ensimmäisestä lähdesekvenssistä ja toinen toiselle lähdekoodille, kuten Zip operato r tarvitsemme myös valikointitoiminnon tuloksen tuottamiseksi arvoparista. julkinen staattinen IObservable TResult Liity TLeft-, TRight-, TLeftDuration-, TRightDuration-, TResult. this IObservable TLeft left. IObservable TRight oikealle. Func TLeft, IObservable TLeftDuration leftDurationSelector. Func TRight, IObervable TRightDuration oikeanDurationSelector. Func TLeft, TRight, TResult tulosSelector. Now tämä on melko karvainen allekirjoitus yrittää ymmärrä yhdellä kertaa, joten anna s ottaa sen yksi parametri kerrallaan. Järkevä TLeft jäljellä on lähdekoodi, joka määrittää kun ikkuna käynnistyy Tämä on aivan kuin puskurin ja ikkunan operaattorit, paitsi että kaikki tämän lähdekoodin julkaisema arvo avaa uuden ikkunan Puskurin ja ikkunan sisälle jotkut arvot juuri putoavat olemassa olevaan ikkunaan. Haluan ajatella, että IObervable TRight on ikkunan arvo sekvenssi Kun vasen sekvenssi ohjaa ikkunoiden avaamista, oikea sekvenssi yritetään yhdistää arvolla vasemmasta sekvenssistä. Kuvitelkaa, että vasen sarja tuottaa arvon, joka luo uuden ikkunan Jos oikea sekvenssi tuottaa arvon ikkunan ollessa avoinna, resultSelector-funktio kutsutaan kahdella arvolla Tämä on liitoksen ydin, joka yhdistää kaksi arvoa sekvenssistä, samassa ikkunassa Tämä johtaa meidät seuraaviin kysymyksiisi Milloin ikkuna sulkeutuu Vastaus tähän kysymykseen on sekä Liity-operaattorin voima ja monimutkaisuus. Kun vasemmalla tuotetaan arvoa, avataan ikkuna, jonka arvo siirretään myös vasenDurationSelector-funktio Tämän toiminnon tulos on IObservable TLeftDuration Kun tämä sekvenssi tuottaa arvon tai täydentää, ikkunan arvo on suljettu Huomaa, että ei ole merkitystä TLeftDuration tyypin kanssa Tämä aluksi jätti minulle tunteen, että IObservable TLeftDuration oli kaikki vähän yli tappaa, kun tarvitset vain jonkinlaista tapahtumaa sanoa Suljettu Kuitenkin antamalla sinun käyttää IObservable T voit tehdä hienoja tavaraa me w ill see later. So ensin kuvitella skenaario, jossa meillä on vasen sarja tuottaa arvoja kaksi kertaa nopeammin kuin oikea järjestys Kuvittele, ettemme myöskään koskaan sulje ikkunoita Voisimme tehdä tämän palaamalla yksikkö aina vasemmaltaDurationSelector-funktio Tämä johtaisi Seuraavat parit tuotetaan. Kuten näet, vasen arvot tallennetaan ja toistetaan joka kerta, kun oikea tuottaa arvon. Nyt tuntuu melko itsestään selvältä, että jos suljin välittömästi ikkunan palauttamalla yksikön tai joskus ikkunoita ei koskaan avata, niin ei parit saisivat koskaan tuotettua Kuitenkin mitä voisin tehdä varmistaakseni, että nämä ikkunat eivät päätyneet päällekkäin niin, että kun toinen arvo tuotettiin, en enää näe ensimmäistä arvoa No, jos palautettaisiin vasen sarja vasemmaltaDurationSelectorilta, joka voisi tehdä sen Odota kuitenkin, kun palaamme vasemmanpuoleiselta vasemmaltaDurationSelectorilta, se yrittäisi luoda toisen tilauksen, ja se saattaa aiheuttaa sivuvaikutuksia. Nopea vastaus tähän on julkaista ja RefCount vasemmalle sekvenssille Jos teemme, että tulokset näyttävät enemmän tältä. Viimeinen esimerkki on hyvin samanlainen kuin CombineLatest, paitsi että se tuottaa vain parin, kun oikea sekvenssi muuttuu. Voimme käyttää Join: ia tuottamaan oman CombineLatestin version Jos arvot vasemmanpuoleisesta sekvenssistä vanhenee, kun seuraava arvo vasemmalta ilmoitettiin, olisin hyvin matkallaan. Minun on kuitenkin tehtävä sama asia oikealle. Onneksi Liity-operaattori antaa meille oikeanDurationSelectorin, joka toimii aivan kuten vasemmallaDurationSelector Tämä on yksinkertainen kaikki, mitä minun tarvitsee tehdä, on palauttaa viittaus samaan vasempaan järjestykseen, kun vasen arvo tuotetaan ja sitten sama oikealle. Koodi näyttää tältä. julkinen staattinen IObservable TResult MyCombineLatest TLeft, TRight, TResult. IObservable TLeft left. On huomionarvoista TRight right. While yllä oleva koodi ei ole tuotannon laatu, sillä olisi oltava joitain portteja paikoillaan kilpa-olosuhteiden lieventämiseksi, se osoittaa meille voiman, jota voisimme päästä liittymällä voimme itse käyttää sitä luomaan muita operaattoreita. Kun Join-operaattori parittaa arvoja, jotka ovat samassa ikkunassa, se tuottaa aina vain vasemman arvon ja oikean arvon tulokseen. Valitsija GroupJoin-operaattori ottaa tämän askeleen eteenpäin kulkee vasemmalla oleva arvo välittömästi tulokseenSelektori, jossa on sarja oikeita arvoja, jotka esiintyvät ikkunassa Se allekirjoitus on hyvin samankaltainen kuin Liitä, mutta huomioi erotus tuloksessaSelector Func. public staattinen IObservable TResult GroupJoin TLeft, TRight, TLeftDuration, TRightDuration, TResult. this IObservable TLeft left. Youistettava TRight right. Func TLeft, IObervable TLeftDuration leftDurationSelector. Func TRight, IObervable TRightDuration oikeanDurationSelector. Func TLeft, IObervable TRight, TResult tulosSelector. Jos menimme takaisin meidän ensimmäinen liity esimerkki, jossa meillä oli. arvot ovat kaksi kertaa niin nopeaa kuin oikea. vasen ei koskaan vanhene. oikeus välittömästi päättyy. tämä on tulos voi näyttää. Nyt voisimme vaihtaa sen ja saada se, että vasen loppunut välittömästi ja oikea ei koskaan päättynyt tulos voi näyttää tältä. Tämä alkaa tehdä asioita mielenkiintoisiksi Sharp lukijat ovat ehkä huomanneet, että GroupJoin voit tehokkaasti uudelleen luoda oma Liity tekemällä jotain tältä. Julkinen IObservable TResult MyJoin TLeft, TRight, TLeftDuration, TRightDuration, TResult. IObservable TLeft left. IObservable TRight oikealle. Func TLeft, IObservable TLeftDuration leftDurationSelector. Func TRight, IObervable TRightDuration rightDurationSelector. Func TLeft, TRight, TResult resultSelector.

No comments:

Post a Comment