Zināšanu bāze

RxJS (Reactive Extensions JavaScript) pielietojuma piemērs

Sveicināti,

Pavisam nesen biju iemūžinājis saiti uz prezentāciju par Rx(Reactive Extensions).

Rx projekts nāk no Microsoft izpētes komandas. Projekta pamatā ir doma, ka visas darbības var uzvērt kā datubāzi(man patīk vairāk datu avots). Piemēram, datora pele ir nekas cits, kā datu avots. Katru mirkli tās raida informāciju par sava stāvokļa izmaiņām. Datorā ar ierīces draivera palīdzību šie te dati nepārtraukti tiek apstrādāti, un pārraidīti tālāk. Šo te principu var pārnest uz programmēšanas platformu.

Piemēram, datu iegūšana no interneta vietnes(datu avots). Vaicājumi pēc datiem ir asinhrons process. Var paiet ilgs laiks no pieprasījuma nosūtīšanas līdz brīdim kad tiek saņemta atbildes. Nav svarīgi vai tā ir pelīte vai komunikācijas protokols vai vel kas, svarīgi būtu iegūt savā rīcībā vienotu veidu, kādā programmēt signāla pārraidi, saņemšanu, filtrāciju un apstrādi. Šiem te mērķiem arī kalpo .NET videi rakstīta Rx bibliotēka, un arī tas JavaScript versija.

Uz piemēra pacentīšos parādīt idejas spēku!

Nospraudīsim darba uzdevumu:

  • Nepieciešams parakstīties uz ASP.NET AJAX asinhronu datu nosūtīšanu uz serveri.

Realizācija


Izstrādātāji, kas ir pazīstami ar ASP.NET noteikti pazīst ScriptManager kontroli. Kontrolei ir visai noteikt mērķis, nodrošinās AJAX funkcionalitāti gan servera gan klienta pusē.

<asp:ScriptManager ID="scriptManager" runat="server" />

Ar šīs kontroles starpniecību pavērās iespēja piekļūt pie AJAX JavaScript API dažādām manipulācijām ar datiem. Manā gadījumā, iespēju noteikt brīdi, kad tiek nosūtīts asinhronais pieprasījums, un tiek saņemta atbildes. Zemāk kods, ar kura palīdzību var parakstīties uz nosūtīšanas notikumu.

var i = Sys.WebForms.PageRequestManager.getInstance();
i.add_beginRequest(function() {});

Līdzīgā veida var parakstīties vel uz vairākiem citiem notikumiem.

Kā jau rakstīju, būtu lieliski, ja notikumu apstrāde būtu vienādota, nav svarīgi vai apstrādāšu pelītes kustību, vai pieprasu datus, vai veicu vel kādu citu darbību.

Tātad pirmajā soli pievienojam RxJS bibliotēku savā kodā.

<script type="text/javascript" src="<%=ResolveUrl("~/Content/rx.js") %>"></script>

No šī brīža vara sākt rakstīt kodu, tā saucamo signālu avotu.

var RequestObservable = {
    Create: function() {
        return Rx.Observable.Create(function(obs) {
            with (Sys.WebForms.PageRequestManager.getInstance()) {
                add_beginRequest(function() {
                    obs.OnNext(false);
                });

                add_endRequest(function() {
                    obs.OnNext(true);
                });
            }

            return {}

        });
    }
};

Izveidoju objektu RequestObservable ar vienīgo metodi Create, kas atgriezīs man tā saucamo Push stila kolekciju. Tas tiek panākts ar Rx.Observable.Create izsaukuma rezultāta atgriešanu. Rx.Observable.Create metodei, kā arguments tiek padota funkcija. Tas ķermenī notiek parakstīšanās uz ASP.NET AJAX notikumiem add_beginRequest un add_endRequest. Tanī brīdī, kad šie notikumi izpildīsies, tiks raidīts signāls ar atšķirīgiem argumentiem. Manā gadījumā tie ir true/false.

Pēc signāla avota izveides, veidojam signāla apstrādes funkcionalitāti.

$(document).ready(
    function() {
        var request = RequestObservable.Create();

        var open = request.Throttle(250).Where(function(e) { return e === false; });
        var close = request.Where(function(e) { return e === true; });

        open.Subscribe(function() {
            // Kods
        });

        close.Subscribe(function() {
            // Kods
        });
    }
);

Izmantoju jQuery lai parakstītos uz lapas ielasīšanu(metodes ready izsaukšana). Pēc lapas ielasīšanas veidojam signāla avotu.

var request = RequestObservable.Create();

Nākamajā solī nodefinēju divus filtrus, kuri veiks signāla šķirošanu.

  • open filtrs atlasīs pieprasīja nosūtīšanu, nolasot tikai signālu, kuri ir pēdējie 250 milisekunžu laikā(metode Throttle).
  • Otrs, close filtrs atlasīs atbildēs saņemšanas signālus.
var open = request.Throttle(250).Where(function(e) { return e === false; });
var close = request.Where(function(e) { return e === true; });

Pēdējais solis, atliek tikai parakstīties uz notikumiem.

open.Subscribe(function() {
    // Kods
});

close.Subscribe(function() {
    // Kods
});

Šinī rakstā centos parādīt maksimāli pietuvinātu dzīvei piemēru. Tas ir tikai viens scenārijs no daudziem.

Cerams, ka noderēs!

Gaidīšu jūsu komentārus, labprāt atbildēšu uz visiem jautājumiem!


Posted Apr 24 2010, 12:30 PM by andrejs.mamontovs
Filed under: , ,

Comments

viesis wrote re: RxJS (Reactive Extensions JavaScript) pielietojuma piemērs
on 09-16-2010 14:10

Ar ko Sys.Application.add_load(function(sender, args) { if (args.get_isPartialLoad()) { function(){} } }); ir sliktāks? un vajag speciālu bibliotēku?

Brandice wrote re: RxJS (Reactive Extensions JavaScript) pielietojuma piemērs
on 07-15-2011 2:06

I found just what I was needed, and it was etnetrianing!

Kaylynn wrote re: RxJS (Reactive Extensions JavaScript) pielietojuma piemērs
on 07-15-2011 21:14

You raelly saved my skin with this information. Thanks!

buy google plus wrote re: RxJS (Reactive Extensions JavaScript) pielietojuma piemērs
on 03-22-2012 19:27

Ueoxho I appreciate you sharing this blog.Really thank you! Want more.

cheap oem software wrote re: RxJS (Reactive Extensions JavaScript) pielietojuma piemērs
on 05-02-2012 7:52

Ax9J4f Say, you got a nice blog article.Really looking forward to read more. Cool.

Cheap Seo Services wrote re: RxJS (Reactive Extensions JavaScript) pielietojuma piemērs
on 08-07-2012 9:23

Tk0ZD7 Major thankies for the blog article. Will read on...

crork wrote re: RxJS (Reactive Extensions JavaScript) pielietojuma piemērs
on 09-10-2012 15:00

rHGFkZ Appreciate you sharing, great article.Much thanks again. Much obliged.

cheap bookmarking service wrote re: RxJS (Reactive Extensions JavaScript) pielietojuma piemērs
on 11-08-2012 1:53

HeK2Eq Great article post.Thanks Again. Cool.

Fiverr best selles wrote re: RxJS (Reactive Extensions JavaScript) pielietojuma piemērs
on 12-08-2012 4:01

q29ZWE Wow, great blog post.Really looking forward to read more. Keep writing.

Atilla wrote re: RxJS (Reactive Extensions JavaScript) pielietojuma piemērs
on 12-12-2012 2:50

I just wanted to point out that the intro to Lambda Expressions you do at the beninging of your presentation is a nice, concise way of presenting things. I've been looking for an easy step-by-step way of demonstrating that to people.Thanks

Tatiana wrote re: RxJS (Reactive Extensions JavaScript) pielietojuma piemērs
on 12-13-2012 7:09

One more thing. It's my opinion that there are many trveal insurance websites of respected companies that allow you enter holiday details and have you the quotations. You can also purchase the actual international holiday insurance policy on the internet by using your current credit card. Everything you need to do is usually to enter your current trveal specifics and you can view the plans side-by-side. Just find the plan that suits your financial allowance and needs after which it use your credit card to buy the item. Travel insurance on the web is a good way to search for a reliable company with regard to international trveal insurance. Thanks for expressing your ideas.

Social bookmarks wrote re: RxJS (Reactive Extensions JavaScript) pielietojuma piemērs
on 03-25-2013 6:43

1N7Ryt Very informative blog post.Thanks Again. Keep writing.

Add a Comment

(obligāts)  
(brīvizvēles)
(obligāts)  
Remember Me?