„Node.js“ srautai ir laikrodžiai

Sužinojęs apie „ Observables“ , manau, kad jie labai panašūs į „ Node.js“ srautus . Abu vartotojai turi pranešimo apie vartotoją mechanizmą, kai atsiranda naujų duomenų, įvyksta klaida arba nėra duomenų (EOF).

Norėčiau sužinoti apie konceptualius / funkcinius skirtumus tarp jų. Ačiū!

53
24 мая '15 в 15:18 2015-05-24 15:18 urish yra nustatytas gegužės 24 d. 15, 15:18 2015-05-24 15:18
ответ 1 atsakymas

Tiek „Observables“, tiek „node.js“ srautai leidžia išspręsti tą pačią pagrindinę problemą: asinchroniškai apdoroti vertybių seką. Manau, pagrindinis skirtumas tarp šių dviejų dalykų yra susijęs su kontekstu, kuris motyvavo jo išvaizdą. Šis kontekstas atsispindi terminologijoje ir API.

„Observables“ pusėje yra „EcmaScript“ plėtinys, kuriame įdiegiamas reaktyvus programavimo modelis. Jis stengiasi užpildyti atotrūkį tarp vertės generavimo ir asinchronijos su minimalistinėmis ir sudėtinėmis „ Observer ir „ Observable sąvokomis.

Skiltyje „node.js“ ir „Srautai“ norėjote sukurti sąsają, skirtą asinchroniniam ir efektyviam tinklo srautų ir vietinių failų apdorojimui. Terminija eina iš šio pradinio konteksto, ir jūs gaunate pipe , chunk , encoding , flush , Duplex , Buffer ir kt. Pragmatiškas požiūris, kuris suteikia aiškią paramą konkretiems naudojimo atvejams, prarasite galimybę rašyti dalykus, nes jis nėra toks vienodas. Pvz., Naudodami Readable ir write srautą naudodamiesi write push “, nors teoriškai tai darote: skelbkite vertę.

Taigi, praktiškai, jei pažvelgsite į sąvokas ir jei naudojatės { objectMode: true } parinktimi, { objectMode: true } galima susieti su Readable ir Observer srautais su Writable srautu. Galite sukurti net kelis paprastus adapterius tarp dviejų modelių.

 var Readable = require('stream').Readable; var Writable = require('stream').Writable; var util = require('util'); var Observable = function(subscriber) { this.subscribe = subscriber; } var Subscription = function(unsubscribe) { this.unsubscribe = unsubscribe; } Observable.fromReadable = function(readable) { return new Observable(function(observer) { function nop() {}; var nextFn = observer.next ? observer.next.bind(observer) : nop; var returnFn = observer.return ? observer.return.bind(observer) : nop; var throwFn = observer.throw ? observer.throw.bind(observer) : nop; readable.on('data', nextFn); readable.on('end', returnFn); readable.on('error', throwFn); return new Subscription(function() { readable.removeListener('data', nextFn); readable.removeListener('end', returnFn); readable.removeListener('error', throwFn); }); }); } var Observer = function(handlers) { function nop() {}; this.next = handlers.next || nop; this.return = handlers.return || nop; this.throw = handlers.throw || nop; } Observer.fromWritable = function(writable, shouldEnd, throwFn) { return new Observer({ next: writable.write.bind(writable), return: shouldEnd ? writable.end.bind(writable) : function() {}, throw: throwFn }); } 

Galbūt jūs pastebėjote, kad pakeitiau keletą pavadinimų ir naudoju paprastesnes Observer ir Subscription koncepcijas, kurios buvo įvestos, kad būtų išvengta perkrauti atsakomybę, kurią „Observables“ Generator generavo. Iš esmės, Subscription leidžia jums atsisakyti jo Observable . Bet kokiu atveju, su aukščiau pateiktu kodu, galite turėti pipe .

 Observable.fromReadable(process.stdin).subscribe(Observer.fromWritable(process.stdout)); 

Palyginti su process.stdin.pipe(process.stdout) , galite derinti, filtruoti ir konvertuoti srautus, kurie taip pat veikia bet kokiai kitai duomenų sekai. Tai galite padaryti naudodami Readable , Transform ir Writable , tačiau API palaiko poklasį, o ne Readable ir pritaikomas funkcijas. Pavyzdžiui, Observable modelyje vertės konvertavimas atitinka transformatoriaus funkcijos taikymą srautui. Tam nereikia naujo „ Transform potipio.

 Observable.just = function() { var values = arguments; return new Observable(function(observer) { [].forEach.call(values, function(value) { observer.next(value); }); observer.return(); return new Subscription(function() {}); }); }; Observable.prototype.transform = function(transformer) { var source = this; return new Observable(function(observer) { return source.subscribe({ next: function(v) { observer.next(transformer(v)); }, return: observer.return.bind(observer), throw: observer.throw.bind(observer) }); }); }; Observable.just(1, 2, 3, 4, 5).transform(JSON.stringify) .subscribe(Observer.fromWritable(process.stdout)) 

Išvada? Lengvai įveskite reaktyvųjį modelį ir Observable koncepciją visur. Sunkiau įgyvendinti visą biblioteką aplink šią koncepciją. Visos šios mažos funkcijos turėtų veikti nuosekliai. Galiausiai „ ReactiveX“ projektas tebevyksta. Bet jei jums tikrai reikia nusiųsti failo turinį klientui, dirbti su kodavimu ir tada ją pataisyti, palaikydami „NodeJS“, ir jis veikia labai gerai.

67
02 июня '15 в 5:32 2015-06-02 05:32 atsakymas pateikiamas m4ktub 02 birželio 15 d. 5:32 2015-06-02 05:32