Pengenalan kepada pengaturcaraan reaktif berfungsi dengan RXJS
- Pengaturcaraan reaktif adalah kaedah pengaturcaraan dengan aliran data serentak, yang boleh menjadi tak segerak. Ia boleh digunakan untuk masalah pengaturcaraan kerana CPU memproses aliran maklumat yang terdiri daripada arahan dan data.
- Sambungan reaktif untuk perpustakaan JavaScript (RXJS) menggunakan kaedah chaining dan memperkenalkan pemerhatian (pengeluar) dan pemerhati (pengguna). Kedua -dua jenis pemerhatian adalah pemerhatian panas, yang mendorong walaupun tidak melanggan, dan pemerhatian sejuk, yang mula menolak hanya apabila melanggan.
- Observables boleh dibuat dari tatasusunan, janji, fungsi dan penjana, dan boleh digunakan untuk memberikan pelbagai nilai pulangan tak segerak. Observables menolak nilai, dan tidak dapat memaksa peristiwa seterusnya akan berlaku.
- RXJS menyediakan banyak pengendali yang memperkenalkan kesesuaian, seperti pendikit, selang, atau kelewatan. Ini boleh digunakan untuk mengagregatkan peristiwa dalam selang waktu yang ditentukan, atau input pendikit hanya untuk memulakan permintaan selepas masa terbiar tertentu.
- RXJS membuat pengaturcaraan reaktif dalam JavaScript lebih mudah dan lebih cekap. Ia menyatukan beberapa konsep pengaturcaraan reaktif dalam satu set kaedah yang ringkas dan boleh diperbaiki. Ia juga mempunyai sambungan yang berguna, seperti rxjs-dom, yang memudahkan interaksi dengan dom.
Artikel ini dikaji semula oleh Moritz Kröger, Bruno Mota dan Vildan Softic. Terima kasih kepada semua pengulas rakan sebaya SitePoint untuk membuat kandungan SitePoint yang terbaik boleh!
Sebelum kita menyelam ke dalam topik kita perlu menjawab soalan penting: Apakah pengaturcaraan reaktif? Sehingga hari ini, jawapan yang paling popular ialah pengaturcaraan reaktif adalah pengaturcaraan dengan aliran data serentak. Kebanyakan masa kita akan mendapati perkataan serentak digantikan oleh asynchronous, bagaimanapun, kita akan melihat kemudian bahawa aliran itu tidak perlu tidak segerak.Adalah mudah untuk melihat bahawa pendekatan "Segala -galanya adalah aliran" boleh digunakan secara langsung kepada masalah pengaturcaraan kami. Lagipun, CPU tidak lebih daripada peranti yang memproses aliran maklumat yang terdiri daripada arahan dan data. Matlamat kami adalah untuk memerhatikan aliran itu dan mengubahnya dalam kes data tertentu.
Prinsip pengaturcaraan reaktif tidak sepenuhnya baru kepada JavaScript. Kami sudah mempunyai perkara seperti mengikat harta, corak EventeMitter, atau aliran Node.js. Kadang -kadang keanggunan kaedah ini datang dengan penurunan prestasi, abstraksi yang terlalu rumit, atau masalah dengan debugging. Biasanya, kelemahan ini adalah minimum berbanding dengan kelebihan lapisan abstraksi baru. Contoh -contoh minimum kami, tentu saja, tidak mencerminkan aplikasi biasa, tetapi menjadi pendek dan ringkas yang mungkin.
Tanpa berlengah lagi, mari kita dapatkan tangan kita kotor dengan bermain dengan perpustakaan reaktif untuk perpustakaan JavaScript (RXJS). RXJS menggunakan banyak chaining, yang merupakan teknik popular yang juga digunakan di perpustakaan lain seperti jQuery. Panduan untuk kaedah chaining (dalam konteks Ruby) boleh didapati di Sitepoint.
Contoh Stream
Sebelum kita menyelam ke RXJS kita harus menyenaraikan beberapa contoh untuk bekerja dengan kemudian. Ini juga akan menyimpulkan pengenalan kepada pengaturcaraan dan aliran reaktif secara umum. Secara umum, kita boleh membezakan dua jenis aliran: dalaman dan luaran. Walaupun bekas itu boleh dianggap buatan dan dalam kawalan kami, yang terakhir datang dari sumber -sumber di luar kawalan kami. Aliran luaran boleh dicetuskan (secara langsung atau tidak langsung) dari kod kami.
Biasanya, aliran tidak menunggu kami. Mereka berlaku sama ada kita boleh mengendalikannya atau tidak. Contohnya jika kita mahu memerhatikan kereta di jalan raya, kita tidak akan dapat memulakan semula aliran kereta. Aliran itu berlaku bebas jika kita memerhatikannya atau tidak. Dalam terminologi Rx kita panggil ini
Hot Observable . Rx juga memperkenalkan Observables Cold , yang berkelakuan lebih seperti Iterator Standard, supaya maklumat dari aliran terdiri daripada semua item untuk setiap pemerhati.
Imej berikut menggambarkan beberapa jenis aliran luaran. Kami melihat bahawa permintaan (dahulu bermula) dan secara amnya menubuhkan cangkuk web disebutkan, serta peristiwa UI seperti interaksi tetikus atau keyboard. Akhirnya, kami juga boleh menerima data dari peranti, contohnya sensor GPS, pecutan, atau sensor lain.
Imej juga mengandungi satu aliran yang dinyatakan sebagai
. Mesej boleh muncul dalam beberapa bentuk. Salah satu bentuk yang paling mudah ialah komunikasi antara laman web kami dan beberapa laman web lain. Contoh lain termasuk komunikasi dengan websocket atau pekerja web. Mari lihat beberapa contoh kod untuk yang terakhir. Kod pekerja dibentangkan di bawah. Kod ini cuba mencari nombor perdana dari 2 hingga 10
10. Sebaik sahaja nombor dijumpai hasilnya dilaporkan.
Secara klasik, pekerja web (dianggap berada dalam fail prime.js) dimasukkan seperti berikut. Untuk keringkasan kami melangkau cek untuk sokongan pekerja web dan kesahihan hasil yang dikembalikan.<span>(function (start<span>, end</span>) { </span> <span>var n = start - 1; </span> <span>while (n++ < end) { </span> <span>var k = Math.sqrt(n); </span> <span>var found = false; </span> <span>for (var i = 2; !found && i <= k; ++i) { </span> found <span>= n % i === 0; </span> <span>} </span> <span>if (!found) { </span> <span>postMessage(n.toString()); </span> <span>} </span> <span>} </span><span>})(2, 1e10); </span>
lebih banyak maklumat mengenai pekerja web dan pelbagai threading dengan JavaScript boleh didapati dalam artikel JavaScript selari dengan paralel.js.
<span>var worker = new Worker('prime.js'); </span>worker<span>.addEventListener('message', function (ev) { </span> <span>var primeNumber = ev.data * 1; </span> <span>console.log(primeNumber); </span><span>}, false); </span>
Memandangkan contoh di atas, kita tahu bahawa nombor perdana mengikuti pengedaran asimtotik di kalangan bilangan bulat positif. Untuk x hingga ∞ kita memperoleh pengedaran x / log (x). Ini bermakna kita akan melihat lebih banyak nombor pada mulanya. Di sini, cek juga lebih murah (iaitu, kami menerima lebih banyak nombor perdana per unit masa pada mulanya daripada kemudian.)
Ini boleh digambarkan dengan paksi masa yang mudah dan gumpalan untuk keputusan:
Dalam kedua -dua senario jawapannya adalah untuk mengagregatkan peristiwa sebelumnya dalam selang waktu tertentu. Perbezaan antara kedua -dua senario yang diterangkan adalah bahawa nombor utama harus selalu ditunjukkan selepas selang waktu yang diberikan (iaitu, beberapa nombor perdana hanya berpotensi tertunda dalam persembahan). Sebaliknya, pertanyaan carian hanya akan mencetuskan permintaan baru jika tiada strok utama berlaku semasa selang yang ditentukan. Oleh itu, pemasa ditetapkan semula apabila strok utama telah dikesan.
rxjs untuk menyelamat
Rx adalah perpustakaan untuk menyusun program asynchronous dan berasaskan acara menggunakan koleksi yang dapat dilihat. Ia terkenal dengan sintaks deklaratif dan komposiliti semasa memperkenalkan model pengendalian dan kesilapan masa yang mudah. Memikirkan contoh bekas kami, kami sangat berminat dengan pengendalian masa. Walau bagaimanapun, kita akan melihat terdapat lebih banyak lagi dalam RXJs untuk mendapat manfaat daripada.
Blok bangunan asas RXJs adalah pemerhatian (pengeluar) dan pemerhati (pengguna). Kami sudah menyebut kedua -dua jenis pemerhatian:
- Observables panas menolak walaupun kita tidak melanggannya (mis., Peristiwa UI).
- Observables sejuk mula menolak hanya apabila kita melanggan. Mereka bermula jika kita melanggan lagi.
<span>(function (start<span>, end</span>) { </span> <span>var n = start - 1; </span> <span>while (n++ < end) { </span> <span>var k = Math.sqrt(n); </span> <span>var found = false; </span> <span>for (var i = 2; !found && i <= k; ++i) { </span> found <span>= n % i === 0; </span> <span>} </span> <span>if (!found) { </span> <span>postMessage(n.toString()); </span> <span>} </span> <span>} </span><span>})(2, 1e10); </span>
Melanggan yang boleh dilihat adalah bebas daripada jenis yang dapat dilihat. Bagi kedua -dua jenis, kami dapat menyediakan tiga fungsi yang memenuhi keperluan asas tatabahasa pemberitahuan yang terdiri daripada OnNext, OneRor, dan OnCompleted. Panggilan balik OnNext adalah wajib.
<span>var worker = new Worker('prime.js'); </span>worker<span>.addEventListener('message', function (ev) { </span> <span>var primeNumber = ev.data * 1; </span> <span>console.log(primeNumber); </span><span>}, false); </span>
tanpa melanggan yang boleh dilihat yang terkandung dalam pembolehubah yang boleh dilihat hanya dapat dilihat sejuk. Walau bagaimanapun, ia juga mungkin untuk menukarnya ke urutan panas (iaitu, kami melakukan langganan pseudo) menggunakan kaedah penerbitan.
<span>(function (start<span>, end</span>) { </span> <span>var n = start - 1; </span> <span>while (n++ < end) { </span> <span>var k = Math.sqrt(n); </span> <span>var found = false; </span> <span>for (var i = 2; !found && i <= k; ++i) { </span> found <span>= n % i === 0; </span> <span>} </span> <span>if (!found) { </span> <span>postMessage(n.toString()); </span> <span>} </span> <span>} </span><span>})(2, 1e10); </span>
Beberapa pembantu yang terkandung dalam RXJS hanya berurusan dengan penukaran struktur data sedia ada. Di JavaScript kita boleh membezakan antara tiga daripadanya:
- Janji untuk mengembalikan hasil asynchronous tunggal,
- berfungsi untuk hasil tunggal, dan
- penjana untuk menyediakan iterators.
yang terakhir adalah baru dengan ES6 dan boleh digantikan dengan tatasusunan (walaupun itu pengganti yang buruk dan harus dianggap sebagai satu nilai) untuk ES5 atau lebih tua.
rxjs kini membawa datatype untuk menyediakan sokongan nilai berganda (pulangan) yang tidak segerak. Oleh itu, empat kuadran kini diisi.
<span>var worker = new Worker('prime.js'); </span>worker<span>.addEventListener('message', function (ev) { </span> <span>var primeNumber = ev.data * 1; </span> <span>console.log(primeNumber); </span><span>}, false); </span>
Banyak pengendali dalam RXJs memperkenalkan kesesuaian, seperti pendikit, selang, atau kelewatan. Sekarang kita akan melihat lagi contoh -contoh sebelumnya, di mana pembantu ini menjadi penting.
Contoh
Pertama, mari kita lihat penjana nombor utama kami. Kami mahu mengagregatkan hasilnya sepanjang masa, supaya UI (terutamanya pada mulanya) tidak perlu berurusan dengan terlalu banyak kemas kini.
di sini, kita sebenarnya mungkin mahu menggunakan fungsi penampan RXJS bersempena dengan pembantu selang yang telah disebutkan sebelumnya.
Hasilnya hendaklah diwakili oleh rajah berikut. Gumpalan hijau timbul selepas selang masa yang ditentukan (diberikan oleh masa yang digunakan untuk membina selang). Penampan akan mengagregatkan semua gumpalan biru yang dilihat semasa selang waktu.
Selain itu, kami juga boleh memperkenalkan Peta, yang membantu kami mengubah data. Sebagai contoh, kami mungkin mahu mengubah hujah -hujah acara yang diterima untuk mendapatkan data yang dihantar sebagai nombor.
Fungsi Ofevent membina yang dapat dilihat dari mana -mana objek menggunakan corak pemancar peristiwa standard. Penampan juga akan mengembalikan array dengan sifar panjang, itulah sebabnya kami memperkenalkan fungsi di mana untuk mengurangkan aliran ke array yang tidak kosong. Akhirnya, dalam contoh ini kita hanya berminat dengan bilangan nombor perdana yang dihasilkan. Oleh itu, kami memetakan penampan untuk mendapatkan panjangnya.
<span>var observable = Rx.<span>Observable</span>.create(function (observer) { </span> observer<span>.onNext(42); </span> observer<span>.onCompleted(); </span><span>}); </span>
Contoh lain ialah kotak pertanyaan carian, yang harus diletakkan untuk memulakan permintaan selepas masa terbiar tertentu. Terdapat dua fungsi yang mungkin berguna dalam senario sedemikian: fungsi pendikit menghasilkan entri pertama yang dilihat dalam tetingkap masa yang ditentukan. Fungsi debounce menghasilkan entri terakhir yang dilihat dalam tetingkap masa yang ditentukan. Tingkap masa juga beralih dengan sewajarnya (iaitu, berbanding dengan item pertama / terakhir).
Kami ingin mencapai tingkah laku yang dicerminkan oleh rajah berikut. Oleh itu, kita akan menggunakan mekanisme debounce.
<span>(function (start<span>, end</span>) { </span> <span>var n = start - 1; </span> <span>while (n++ < end) { </span> <span>var k = Math.sqrt(n); </span> <span>var found = false; </span> <span>for (var i = 2; !found && i <= k; ++i) { </span> found <span>= n % i === 0; </span> <span>} </span> <span>if (!found) { </span> <span>postMessage(n.toString()); </span> <span>} </span> <span>} </span><span>})(2, 1e10); </span>
Terdapat dua bahagian penting dalam keseluruhan ungkapan ini. Satu adalah transformasi teks pertanyaan kepada permintaan menggunakan Searchfor, yang lain adalah fungsi Switch (). Yang terakhir mengambil sebarang fungsi yang mengembalikan pemerhatian bersarang dan menghasilkan nilai hanya dari urutan yang paling terkini.
Fungsi untuk membuat permintaan boleh ditakrifkan seperti berikut:
<span>var worker = new Worker('prime.js'); </span>worker<span>.addEventListener('message', function (ev) { </span> <span>var primeNumber = ev.data * 1; </span> <span>console.log(primeNumber); </span><span>}, false); </span>
KESIMPULAN
RXJS membuat pengaturcaraan reaktif dalam JavaScript sebagai realiti yang menggembirakan. Sebagai alternatif, terdapat juga bacon.js, yang berfungsi sama. Walau bagaimanapun, salah satu perkara terbaik mengenai RXJS adalah RX sendiri, yang boleh didapati di banyak platform. Ini menjadikan peralihan ke bahasa, platform, atau sistem lain agak mudah. Ia juga menyatukan beberapa konsep pengaturcaraan reaktif dalam satu set kaedah yang ringkas dan boleh diperbaiki. Selain itu, beberapa sambungan yang sangat berguna wujud, seperti RXJS-DOM, yang memudahkan interaksi dengan dom.
di mana anda melihat rxjs bersinar?
soalan yang sering ditanya mengenai pengaturcaraan reaktif berfungsi dengan RXJS
Apakah perbezaan antara pengaturcaraan fungsional dan pengaturcaraan reaktif berfungsi? FP adalah gaya pengaturcaraan yang merawat pengiraan sebagai penilaian fungsi matematik dan mengelakkan perubahan data keadaan dan berubah. Ia menekankan penggunaan fungsi, berbeza dengan gaya pengaturcaraan yang penting, yang menekankan perubahan dalam keadaan. Ia menggabungkan model pengaturcaraan reaktif dengan pengaturcaraan berfungsi. Di FRP, anda boleh menyatakan statik (mis., Array) dan dinamik (mis., Klik tetikus, permintaan web) aliran data dan bertindak balas terhadap perubahan mereka. 🎜> rxjs (sambungan reaktif untuk JavaScript) adalah perpustakaan untuk pengaturcaraan reaktif menggunakan pemerhatian, untuk memudahkan untuk mengarang kod asynchronous atau callback. Ini menjadikannya sesuai untuk pengaturcaraan reaktif berfungsi. Dengan RXJS, anda boleh membuat aliran data dari pelbagai sumber dan juga mengubah, menggabungkan, memanipulasi, atau bertindak balas terhadap aliran data ini menggunakan pengendali yang disediakan. Konsep teras dalam RXJS. Mereka adalah aliran data, yang boleh memancarkan pelbagai nilai dari masa ke masa. Mereka boleh memancarkan tiga jenis nilai: seterusnya, kesilapan, dan lengkap. Nilai 'seterusnya' boleh menjadi objek JavaScript, 'ralat' adalah objek ralat apabila ada yang salah, dan 'lengkap' tidak mempunyai nilai, ia hanya memberi isyarat bahawa yang dapat dilihat tidak akan memancarkan nilai lagi.
Bagaimana saya mengendalikan kesilapan dalam rxjs?
RXJS menyediakan beberapa pengendali untuk mengendalikan kesilapan, seperti CatchError dan Retry. Operator CatchError menangkap ralat pada sumber yang dapat dilihat dan meneruskan aliran dengan baru yang dapat dilihat atau ralat. Operator Retry Resubscribes ke sumber yang dapat dilihat apabila gagal. ',' penapis ',' concat ',' mengurangkan ', dan lain -lain. Terdapat berpuluh -puluh pengendali yang terdapat dalam RXJ yang boleh digunakan untuk mengendalikan manipulasi koleksi yang kompleks, sama ada mereka adalah tatasusunan item, aliran peristiwa, atau bahkan janji.
Bagaimana saya boleh menguji kod RXJS saya? Anda juga boleh menggunakan gambarajah marmar untuk memvisualisasikan pemerhatian semasa ujian. Ia digunakan dalam modul HTTP sudut dan juga dalam kelas Eventemitter yang digunakan untuk peristiwa tersuai.
Apakah perbezaan antara janji -janji dan pemerhatian? Janji adalah nilai yang mungkin belum tersedia. Ia boleh diselesaikan (dipenuhi atau ditolak) hanya sekali. Sebaliknya, yang dapat dilihat adalah aliran nilai yang boleh memancarkan nilai sifar atau lebih, dan ia boleh dilanggan atau tidak dilanggan dari. Apabila anda melanggan yang dapat dilihat, anda mendapat objek langganan. Anda boleh menghubungi kaedah berhenti berlangganan pada objek ini untuk membatalkan langganan dan berhenti menerima data. multicasted kepada banyak pemerhati. Tidak seperti pemerhatian biasa, subjek mengekalkan pendaftaran banyak pendengar.
Atas ialah kandungan terperinci Pengenalan kepada pengaturcaraan reaktif berfungsi dengan RXJS. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Alat AI Hot

Undresser.AI Undress
Apl berkuasa AI untuk mencipta foto bogel yang realistik

AI Clothes Remover
Alat AI dalam talian untuk mengeluarkan pakaian daripada foto.

Undress AI Tool
Gambar buka pakaian secara percuma

Clothoff.io
Penyingkiran pakaian AI

Video Face Swap
Tukar muka dalam mana-mana video dengan mudah menggunakan alat tukar muka AI percuma kami!

Artikel Panas

Alat panas

Notepad++7.3.1
Editor kod yang mudah digunakan dan percuma

SublimeText3 versi Cina
Versi Cina, sangat mudah digunakan

Hantar Studio 13.0.1
Persekitaran pembangunan bersepadu PHP yang berkuasa

Dreamweaver CS6
Alat pembangunan web visual

SublimeText3 versi Mac
Perisian penyuntingan kod peringkat Tuhan (SublimeText3)

Topik panas











Python lebih sesuai untuk pemula, dengan lengkung pembelajaran yang lancar dan sintaks ringkas; JavaScript sesuai untuk pembangunan front-end, dengan lengkung pembelajaran yang curam dan sintaks yang fleksibel. 1. Sintaks Python adalah intuitif dan sesuai untuk sains data dan pembangunan back-end. 2. JavaScript adalah fleksibel dan digunakan secara meluas dalam pengaturcaraan depan dan pelayan.

Peralihan dari C/C ke JavaScript memerlukan menyesuaikan diri dengan menaip dinamik, pengumpulan sampah dan pengaturcaraan asynchronous. 1) C/C adalah bahasa yang ditaip secara statik yang memerlukan pengurusan memori manual, manakala JavaScript ditaip secara dinamik dan pengumpulan sampah diproses secara automatik. 2) C/C perlu dikumpulkan ke dalam kod mesin, manakala JavaScript adalah bahasa yang ditafsirkan. 3) JavaScript memperkenalkan konsep seperti penutupan, rantaian prototaip dan janji, yang meningkatkan keupayaan pengaturcaraan fleksibiliti dan asynchronous.

Penggunaan utama JavaScript dalam pembangunan web termasuk interaksi klien, pengesahan bentuk dan komunikasi tak segerak. 1) kemas kini kandungan dinamik dan interaksi pengguna melalui operasi DOM; 2) pengesahan pelanggan dijalankan sebelum pengguna mengemukakan data untuk meningkatkan pengalaman pengguna; 3) Komunikasi yang tidak bersesuaian dengan pelayan dicapai melalui teknologi Ajax.

Aplikasi JavaScript di dunia nyata termasuk pembangunan depan dan back-end. 1) Memaparkan aplikasi front-end dengan membina aplikasi senarai TODO, yang melibatkan operasi DOM dan pemprosesan acara. 2) Membina Restfulapi melalui Node.js dan menyatakan untuk menunjukkan aplikasi back-end.

Memahami bagaimana enjin JavaScript berfungsi secara dalaman adalah penting kepada pemaju kerana ia membantu menulis kod yang lebih cekap dan memahami kesesakan prestasi dan strategi pengoptimuman. 1) aliran kerja enjin termasuk tiga peringkat: parsing, penyusun dan pelaksanaan; 2) Semasa proses pelaksanaan, enjin akan melakukan pengoptimuman dinamik, seperti cache dalam talian dan kelas tersembunyi; 3) Amalan terbaik termasuk mengelakkan pembolehubah global, mengoptimumkan gelung, menggunakan const dan membiarkan, dan mengelakkan penggunaan penutupan yang berlebihan.

Python dan JavaScript mempunyai kelebihan dan kekurangan mereka sendiri dari segi komuniti, perpustakaan dan sumber. 1) Komuniti Python mesra dan sesuai untuk pemula, tetapi sumber pembangunan depan tidak kaya dengan JavaScript. 2) Python berkuasa dalam bidang sains data dan perpustakaan pembelajaran mesin, sementara JavaScript lebih baik dalam perpustakaan pembangunan dan kerangka pembangunan depan. 3) Kedua -duanya mempunyai sumber pembelajaran yang kaya, tetapi Python sesuai untuk memulakan dengan dokumen rasmi, sementara JavaScript lebih baik dengan MDNWebDocs. Pilihan harus berdasarkan keperluan projek dan kepentingan peribadi.

Kedua -dua pilihan Python dan JavaScript dalam persekitaran pembangunan adalah penting. 1) Persekitaran pembangunan Python termasuk Pycharm, Jupyternotebook dan Anaconda, yang sesuai untuk sains data dan prototaip cepat. 2) Persekitaran pembangunan JavaScript termasuk node.js, vscode dan webpack, yang sesuai untuk pembangunan front-end dan back-end. Memilih alat yang betul mengikut keperluan projek dapat meningkatkan kecekapan pembangunan dan kadar kejayaan projek.

C dan C memainkan peranan penting dalam enjin JavaScript, terutamanya digunakan untuk melaksanakan jurubahasa dan penyusun JIT. 1) C digunakan untuk menghuraikan kod sumber JavaScript dan menghasilkan pokok sintaks abstrak. 2) C bertanggungjawab untuk menjana dan melaksanakan bytecode. 3) C melaksanakan pengkompil JIT, mengoptimumkan dan menyusun kod hot-spot semasa runtime, dan dengan ketara meningkatkan kecekapan pelaksanaan JavaScript.
